今天在工作中调用一个生成id的远程http接口,此接口当不能生成id的时候返回null,自己内部catch了异常。我们调用方是用spring clound 的feign来包装调用的,调用的地方特别多,当这个接口返回错误的时候,熔断可以接管,我们可以做处理,当返回null的时候,是正常请求,不会报错。但是返回null不符合我们的预期。
SynchronousMethodHandler
SpringDecoder
ResponseEntityDecoder
@Configuration
public class AwardDecoderConfiguration {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Autowired
private Environment env;
@Bean
@ConditionalOnMissingBean
public Decoder feignDecoder() {
return new AwardResponseEntityDecoder(new SpringDecoder(this.messageConverters), this.env);
}
}
public class AwardResponseEntityDecoder extends ResponseEntityDecoder {
private static final Logger LOGGER = LoggerFactory.getLogger(AwardResponseEntityDecoder.class);
/**
* 环境信息
*/
private Environment env;
public AwardResponseEntityDecoder(Decoder decoder, Environment env) {
super(decoder);
this.env = env;
}
@Override
public Object decode(final Response response, Type type) throws IOException, FeignException {
Object obj = super.decode(response, type);
if (obj == null) {
String requestUrl = response.request().url();
String idUrl = env.getProperty("idUrl");
if (requestUrl.indexOf(idUrl) > -1) {
LOGGER.error("接口异常,url========>" + requestUrl);
throw new RuntimeException("接口异常");
}
}
return obj;
}
}