You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC中如何为@ControllerAdvice/@ExceptionHandler设置UTF-8编码?

解决@ControllerAdvice返回西里尔文乱码问题

下面是几种可行的解决方案,按推荐优先级排序:

方法1:配置全局消息转换器(推荐)

通过Java配置统一设置Spring MVC的消息转换器字符集,确保所有响应(包括异常响应)都使用UTF-8编码:

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        jsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
        
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        jsonConverter.setSupportedMediaTypes(supportedMediaTypes);
        
        converters.add(jsonConverter);
    }
}

方法2:在异常处理中手动设置响应头编码

直接在handleConflict方法里给响应头指定UTF-8编码:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(value = {
        NoSuchElementException.class,
        IllegalArgumentException.class,
        ServiceUnavailableException.class})
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest req) {
        String responseBody = ex.getMessage();
        HttpHeaders headers = new HttpHeaders();
        // 设置响应内容类型为带UTF-8编码的JSON
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        
        return handleExceptionInternal(ex, responseBody, headers, HttpStatus.BAD_REQUEST, req);
    }
}

方法3:重写handleExceptionInternal统一处理编码

如果有多个异常处理方法,重写父类的handleExceptionInternal方法,统一为所有异常响应设置编码:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    
    @ExceptionHandler(value = {
        NoSuchElementException.class,
        IllegalArgumentException.class,
        ServiceUnavailableException.class})
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest req) {
        String responseBody = ex.getMessage();
        return handleExceptionInternal(ex, responseBody, new HttpHeaders(), HttpStatus.BAD_REQUEST, req);
    }

    @Override
    protected ResponseEntity<Object> handleExceptionInternal(
            Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        return super.handleExceptionInternal(ex, body, headers, status, request);
    }
}

额外检查:Tomcat编码配置

确保Tomcat的server.xml中Connector节点配置了UTF-8编码,避免容器层面的编码问题:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true"/>

内容的提问来源于stack exchange,提问作者cognosce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:27:24