问题描述
请求的controller
@RestController
@RequestMapping("/user")
……
@PostMapping("/unit/update")
public String unitUpdate(@Validated(VaildatedInterface.UserUnitUpdate.class) UserUnit userUnit) {
return JsonUtil.formatInsertJSON(userService.updateUserUnit(userUnit));
}
接口请求返回json中的中文内容变成[???]
{
"code": "1402",
"message": "??????",
"data": "id ID???? ",
"success": false
}
正确的返回应该是
{
"code": "1402",
"message": "对象校验异常",
"data": "id ID不能为空",
"success": false
}
问题出现的环境背景及自己尝试过哪些方法
spring-mvc配置文件里没有添加msgconver这个配置的时候所有的json中文返回都是[?];
<mvc:annotation-driven>
<!-- 指定http返回编码格式,不然返回ajax请求json会出现中文乱码 -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" index="0">
</constructor-arg>
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>*/*;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
我添加了配置之后,如果请求成功能够进入到controller里面返回中文没问题;但是我给controller层加了一个统一的异常处理,经过异常处理返回的json中文又变成[?];上面的返回中文[?]就是经过了controllerException的,但是控制台打印的异常是中文没问题的;
@ControllerAdvice
@ResponseBody
public class ControllerException {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(BindException.class)
public String bindException(Exception e) {
List<ObjectError> eList = ((BindException) e).getBindingResult().getAllErrors();
String errStr = "";
for(int i=0; i< eList.size(); i++) {
errStr += ((FieldError) eList.get(i)).getField() + " " + eList.get(i).getDefaultMessage() + " ";
}
return resultError(e, CodeEnum.CODE_1402, errStr);
}
……
/**
* 异常打印返回
* @param e 异常类
* @param c 编码
* @return
*/
private String resultError(Exception e, CodeEnum c) {
logger.warn(e.getMessage());
logger.warn(c.getMessage());
return JsonUtil.formatJSON(c, e.getMessage());
}
}
相关代码
另外我给tomcat的启动添加了-Dfile.encoding=utf-8
你期待的结果是什么?实际看到的错误信息又是什么?
发生异常是请求到controller对象校验不通过返回的,这个时候还需要给配置哪些才能让全局返回json中文都不会出问题呢?
添加回答
举报
0/150
提交
取消