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;
}