Feign吃掉了Exception Message
文章目录
0. 前言
最近开始使用Feign框架代替Resttemplate,Feign框架初衷是用于给Spring Cloud通讯使用的,虽然项目不是微服务,但我们也慢慢转为使用Feign,好处就是简洁方便,省去了很多的封装。
在开发中遇到一个问题,请求外部一个接口,对方服务抛出异常信息(json string),笔者捕获后将异常信息返回给前端提示用户,但却走到了兜底的异常信息处理逻辑,排查后发现是服务返回的 异常信息被截断 了,导致JSON格式化异常,没有正常解析异常信息。
1. 模拟
1.1 服务端
写一个简单的服务接口吧,如果入参是exception,抛出一个异常。
import cn.horizon.nile.dto.CommonResponseDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Copyright: Horizon
*
* @ClassName SimpleController
* @Description controller
* @Author Nile (Email:576109623@qq.com)
* @Date 16:50 2024-7-20
* @Version 1.0.0
*/
@Slf4j
@RequestMapping("/api/v1/simple")
@RestController
public class SimpleController {
/**
* 检索
* @author Nile (Email:576109623@qq.com)
* @date 17:11 2024-7-20
* @param keyword 关键词
* @return 结果
*/
@GetMapping("/search")
public CommonResponseDTO<Void> search(@RequestParam("keyword") String keyword) {
log.info(keyword);
// 如果入参是exception,抛出一个异常
if ("exception".equals(keyword)) {
throw new RuntimeException("Spring Cloud OpenFeign是一种基于Spring Cloud的声明式REST客户端,它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口,并且可以通过注解的方式来声明请求参数、请求方式、请求头等信息,从而使得客户端的使用更加方便和简洁。同时,它还提供了负载均衡和服务发现等功能,可以与Eureka、Consul等注册中心集成使用。Spring Cloud OpenFeign能够提高应用程序的可靠性、可扩展性和可维护性,是构建微服务架构的重要工具之一。");
}
// 返回个成功码
return new CommonResponseDTO<>("SUC000");
}
}
响应体
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Copyright: Horizon
*
* @ClassName CommonResponseDTO
* @Description 响应体
* @Author Nile (Email:576109623@qq.com)
* @Date 0:12 2024-7-23
* @Version 1.0.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResponseDTO<T> {
/**
* 响应码
*/
private String code;
/**
* 提示信息
*/
private String message;
/**
* 数据
*/
private T data;
public CommonResponseDTO(String code) {
this.code = code;
}
public CommonResponseDTO(String code, String message) {
this.code = code;
this.message = message;
}
}
全局异常处理器,这里HTTP响应码返回500,发现如果异常情况下响应码是2XX,Feign其实是不会当做error处理的。
import cn.horizon.nile.dto.CommonResponseDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework