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
相关产品推荐
相关产品推荐

