在一天夜里。我在使用feign的调用时,突然出现了一点点问题。
就是对于feign类型的包装问题。产生了疑问。
在后来,也就是今天。在网上取取经。看到了一个答案。说:feign的调用会有一个编码器和解码器。
使用feign的解码器。他的原理也很简单。也就是从controller层的返回前端的数据。拆包取出响应的数据。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lz.common.Result;
import feign.FeignException;
import feign.Response;
import feign.Util;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.Type;
@Component
public class ResponseDecoder implements Decoder {
private final ObjectMapper objectMapper;
public ResponseDecoder(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
if (response.body() == null) {
return null;
}
byte[] content = Util.toByteArray(response.body().asInputStream());
// 将HTTP响应内容转换为Result对象
Result<?> result = objectMapper.readValue(content, Result.class);
return result.getData();
}
}
这个会让feign调用的数据拆包。
2,进阶版
将这个工具类放在公共包中
public abstract class AbstractResponseDecoder implements Decoder {
private final ObjectMapper objectMapper;
public AbstractResponseDecoder(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
if (response.body() == null) {
return null;
}
byte[] content = Util.toByteArray(response.body().asInputStream());
// 将HTTP响应内容转换为Result对象
Result<?> result = objectMapper.readValue(content, Result.class);
return result.getData();
}
}
在使用的时候调用就可以了
@Component
public class ResponseDecoder extends AbstractResponseDecoder {
public ResponseDecoder(ObjectMapper objectMapper) {
super(objectMapper);
}
}
值得一说的是
这个feign的接口接收类型可以都用Object接收,也可以使用原本类型的接收。
@RequestMapping("/game")
Object demo();
@RequestMapping("/game/list")
Object demo2();
@RequestMapping("/game/booleans")
Object demo3();
都可以,在使用时,在前面转化就好了。