feign自定义ErrorDecoder 错误时返回统一的错误对象

曾经的接口开发,大家都习惯返回200状态码,然后在响应体中使用以下形式

{
	code:200
	data:{
		key:value
	}
	msg:msg
}

如果我们想让异常情况下,y也返回json对象,怎么实现呢

{
	error_code:200
	message:message
}


这时候正常和异常返回不同对象,在feign中就需要不同的处理。
做法就是使用自定义的ErrorDecoder,在返回码不是2XX会进入这个处理流程

@FeignClient(name = "hello", configuration = [Configuration::class])

.......


open class ExceptionErrorDecoder(private var objectMapper: ObjectMapper = ObjectMapper()) : ErrorDecoder {
    private val logger = LoggerFactory.getLogger(ExceptionErrorDecoder::class.java)

    override fun decode(s: String, response: Response): Exception {
        val reader = response.body().asReader()
        val body = Util.toString(reader)
        logger.info("feign接口url:${response.request().url()},body:$body")
        val javaType =
            objectMapper.typeFactory.constructParametricType(Map::class.java, String::class.java, String::class.java)
        try {
            val map: Map<String, String> = objectMapper.readValue(body, javaType)
            return CommonException(map.getValue("code"), map.getValue("message"))
        } catch (e: IOException) {
            logger.warn("字符串转List失败,{}", e.message)
        }
        return CommonException("500", "未知异常")
    }
}



open class Configuration {

    @Bean
    open fun exceptionErrorDecoder(): ExceptionErrorDecoder {
        return ExceptionErrorDecoder()
    }
}
如果不用给每个FeignClient定义不同的配置,
可以加@Configuration注解,并且不用在每个FeignClient上指定配置。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Feign是一个声明式的HTTP客户端,它简化了HTTP客户端的开发。在使用Feign进行服务调用,我们可能会遇到一些异常,例如HTTP响应码不是200,或者响应体格式不符合预期等等。为了更好地处理这些异常情况,我们可以自定义一个ErrorDecoder来处理错误响应。下面是一个示例: ```java public class MyErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { Exception exception = null; try { // 解析响应体中的错误信息 String body = Util.toString(response.body().asReader()); JSONObject json = JSONObject.parseObject(body); String errorMsg = json.getString("msg"); // 根据响应码选择不同的异常型 if (response.status() == 400) { exception = new BadRequestException(errorMsg); } else if (response.status() == 401) { exception = new UnauthorizedException(errorMsg); } else if (response.status() == 404) { exception = new NotFoundException(errorMsg); } else if (response.status() == 500) { exception = new InternalServerErrorException(errorMsg); } } catch (IOException e) { exception = new RuntimeException(e); } if (exception != null) { return exception; } // 返回默认的异常 return new FeignException.Default( response.status(), response.reason(), response.request().url(), null); } } ``` 在上面的示例中,我们自定义了一个MyErrorDecoder实现了FeignErrorDecoder接口,并实现了其中的decode方法。在该方法中,我们首先解析了响应体中的错误信息,然后根据响应码选择不同的异常型进行抛出。如果响应码不在我们预期的范围内,则返回默认的异常型。 接着,在使用Feign进行服务调用,我们可以通过@FeignClient注解的errorDecoder属性指定我们自定义ErrorDecoder,如下所示: ```java @FeignClient(name = "example-service", errorDecoder = MyErrorDecoder.class) public interface ExampleServiceClient { @RequestMapping(value = "/example", method = RequestMethod.GET) String getExample(); } ``` 这样,在服务调用,如果遇到了异常情况,就会调用我们自定义ErrorDecoder来处理错误响应,并抛出对应的异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值