JAVA SprimgMVC JSON返回中文问号

问题描述

请求的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中文都不会出问题呢?

千万里不及你
浏览 497回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java