在 Spring Boot 返回中文全部都变成了乱码,起初试过在 yml 配置文件添加字符格式限制,不起作用,然后我配置的拦截器,也是不起作用。
后面发现,我在 controller 写的接口返回中文是正常的,但只有在全局异常返回的中文是乱码。其实现在就已经定位到问题了。
方法1
直接通过 response 返回,这个问题治根不治本,建议方法2
@RestControllerAdvice
public class GlobalExceptionHandler {
private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(InvalidPasswordException.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public void handleInvalidPasswordException(HttpServletResponse response, InvalidPasswordException error) {
log.error(error.getLocalizedMessage());
response.setContentType("text/plain;charset=utf-8");
try {
response.getWriter().write("您没有访问该系统的权限!请联系管理员!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法2
设置一个全局过滤器
@RestControllerAdvice
public class GlobalExceptionHandler {
private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(InvalidPasswordException.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public String handleInvalidPasswordException(InvalidPasswordException error) {
log.error(error.getLocalizedMessage());
return "您没有访问该系统的权限!请联系管理员!";
}
}
@Configuration
public class CharsetConfig extends WebMvcConfigurationSupport {
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.stream()
// 过滤出StringHttpMessageConverter类型实例
.filter(StringHttpMessageConverter.class::isInstance)
.map(c -> (StringHttpMessageConverter) c)
// 这里将转换器的默认编码设置为utf-8
.forEach(c -> c.setDefaultCharset(StandardCharsets.UTF_8));
}
}