项目中使用ResponseBodyAdvice同一封装返回格式,对于一般的类型都没有问题,但是处理字符串时,遇到了类型转换的问题,debug一步一步跟踪,原来是对于字符串的ContentType是“text-plain”,ConverterType是StringHttpMessageConverter这个类型转换,由于将结果封装成了自定义的Result类型,所以有Result转换成String报错。

如何改正呢,其实很简单,将返回String的ContentType变成“application/json; charset=UTF-8“。然后将自定义的Result转换成json字符串,上代码:

1:将返回String的ContentType变成“application/json; charset=UTF-8“,下面代码标红部分即完成此部分工作。@ResponseResult此注解是用来标识哪些类或者方法需要统一返回格式。

    @RequestMapping(value = "/do_login",produces = "application/json; charset=UTF-8")
@ResponseBody
@ResponseResult
public String doLogin(HttpServletResponse response, @Valid LoginVo loginVo) {
log.info(loginVo.toString());
//登录
String token = userService.login(response, loginVo);
return token;
}

2:将自定义的Result转换成json字符串,下面标红的部分为重点

/**
* 根据标识,统一返回类型
*/
@ControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice{ private final Logger logger = LoggerFactory.getLogger(ResponseResultHandler.class); @Override
public boolean supports(MethodParameter returnType, Class converterType) {
ServletRequestAttributes sr = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = sr.getRequest();
     //这里是往request获取一个参数,这个参数标识是否需要统一返回格式,设置参数的过程就是写了一个拦截器,判断有无@ResponseResult注解,如果有存入这个标识参数
ResponseResult ResponseResult = (ResponseResult)request.getAttribute(ResponseResultInterceptor.RESPONSE_RESULT_ANN);
request.removeAttribute(ResponseResultInterceptor.RESPONSE_RESULT_ANN);
return ResponseResult == null ? false:true;
} @Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
logger.info("进入返回体,重写格式中");
    if(body instanceof GlobalException){
    logger.info("返回值异常,做包装异常处理");
    GlobalException gx = (GlobalException)body;
    return Result.error(gx.getCm());
    }
    //已经是Result类型不做处理,全局异常处理就是返回的Result类型
    //抛异常时先是全局异常处理程序处理,然后才是返回结果处理
    if(body instanceof Result){
    return body;
    }     //当返回类型是String时,用的是StringHttpMessageConverter转换器,无法转换为Json格式
    //必须在方法体上标注RequestMapping(produces = "application/json; charset=UTF-8")
    if(body instanceof String){
     String str = JSON.toJSONString(Result.success(body));
     return str;
    }
return Result.success(body);
}
}

  

最新文章

  1. iOS--UIAlertView与UIAlertController和UIAlertAction之间的事儿
  2. php提供更快的文件下载
  3. C# 文件压缩加解密
  4. [异常解决] 安卓6.0权限问题导致老蓝牙程序出现异常解决办法:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission...
  5. Android驱动入门-Led控制+app+ndk库+底层驱动
  6. 深入分析 Java 中的中文编码问题
  7. 【mysql的紧急应用】
  8. As of ADT 14, resource fields cannot be used as switch cases
  9. DB2之隔离级别和锁的论述
  10. Spring MVC Checkbox And Checkboxes Example
  11. Ror初学笔记
  12. iOS SDK:预览和打开文档
  13. Spring MVC中,事务是否可以加在Controller层
  14. JavaScript 闭包究竟是什么
  15. isupper()函数
  16. bzoj:1685 [Usaco2005 Oct]Allowance 津贴
  17. 在循环列表的富文本里摘出每个item的img标签内容(适合vue渲染)
  18. 常见jquery面试题
  19. spring 中IOC实验(一)
  20. NOIP2010普及组 三国游戏

热门文章

  1. windows下使用虚拟机安装linux操作系统
  2. demo项目开发(Python+flask+mysql+redis只包含后端接口)
  3. Thunk函数的使用
  4. 程序员如何高效学Python,如何高效用Python挣钱
  5. 尚学堂 217 java中的字节码操作2
  6. android 6.0 以上在doze模式精确定时
  7. 【题解】[BalticOI 2014]friends
  8. python+opencv切割细胞及细胞团(持续更新)
  9. JS中style.display和style.visibility的区别
  10. DevOps研发模式下「产品质量度量」方案实践