在一天夜里。我在使用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;}@Overridepublic 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;}@Overridepublic 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();
都可以,在使用时,在前面转化就好了。