Springboot使用ResponseBodyAdvice处理String类型返回值异常

作者:陆金龙    发表时间:2022-02-18 02:46   

关键词:ResponseBodyAdvice  String类型  StringHttpMessageConverter  

内容来源:Springboot使用了ResponseBodyAdvice处理返回值异常? - 少不读水浒的个人空间 - OSCHINA - 中文开源技术交流社区

 

为了统一接口响应的报文,现实了ResponseBodyAdvice接口,通过这个接口的实现类来统一处理报文

 

public class BaseGlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {

   //这个方法表示对于哪些请求要执行beforeBodyWrite,返回true执行,返回false不执行
   @Override
   public boolean supports(MethodParameter methodParameter, Class aClass) {
      return true;
   }

   //对于返回的对象如果不是最终对象ResponseResult,则选包装一下
   @Override
   public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
         Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
      if(!(o instanceof ResponseResult)) {
         ResponseResult responseResult = new ResponseResult(CodeConstant.SUCCESS, o);
         return responseResult;
      }
      return o;
   }

}

在StringMessageConverter类型,他只接受String类型的返回类型。

我们在ResponseBodyAdvice中将返回值从String类型改成ResponseResult类型之后,调用StringMessageConverter方法发生类型强转。ReponseResult无法转换成String,发生类型转换异常。

 

解决该异常最好的方式就是重写StringMessageConverter方法,让他可以解决ResonseResult类型的转化。

这样相对比较麻烦,所以换了一种思路,在ResponseBodyAdvice中做了针对String类型返回值的修改。

 

@Override

   public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
         Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
      if(!(o instanceof ResponseResult)) {
         ResponseResult responseResult = new ResponseResult(CodeConstant.SUCCESS, o);
         //因为handler处理类的返回类型是String,为了保证一致性,这里需要将ResponseResult转回去
         if(o instanceof String) {
            return JSON.toJSONString(responseResult);
         }
         return responseResult;
      }
      return o;
   }