spring boot 全局异常处理捕获字符集异常的核心做法是注册一个实现 handlerexceptionresolver 接口的 bean,并在其中拦截 unsupportedcharsetexception。当请求参数或路径中的字符编码不被支持时,该解析器会捕获异常并返回自定义的 http 400 错误响应,从而避免应用崩溃。

如何配置全局异常处理器来拦截 UnsupportedCharsetException
要实现这一功能,需要创建一个 Spring 组件类,实现 HandlerExceptionResolver 接口。在 resolveException 方法中,通过判断异常类型是否为 UnsupportedCharsetException 来决定是否处理。如果匹配成功,则构建一个包含错误信息的 ResponseEntity 对象并返回。Spring MVC 会自动将该返回值转换为 HTTP 响应发送给客户端。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response,
Object handler, Exception ex) {
if (ex instanceof UnsupportedCharsetException) {
UnsupportedCharsetException charsetEx = (UnsupportedCharsetException) ex;
String message = "Unsupported charset: " + charsetEx.getCharsetName();
try {
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.getWriter().write(message);
} catch (java.io.IOException e) {
// Ignore
}
return new ModelAndView();
}
return null; // Let other resolvers handle it
}
}
上述代码定义了一个名为 GlobalExceptionHandler 的组件。它实现了 resolveException 方法,该方法接收当前请求、响应、处理器对象以及抛出的异常。首先检查异常是否为 UnsupportedCharsetException 的子类。如果是,则提取出导致异常的字符集名称,并将其封装在错误消息中。接着设置 HTTP 状态码为 400(Bad Request),并将消息写入响应体。最后返回一个空的 ModelAndView 以表示异常已被处理。如果异常不是目标类型,则返回 null,让其他异常处理器继续尝试处理。
测试字符集异常捕获的具体输入与结果
为了验证上述全局异常处理器的有效性,可以构造一个包含非法字符集名称的请求。例如,使用 curl 命令发送一个带有 charset=INVALID_CHARSET 参数的 GET 请求。由于该字符集不存在于 JVM 支持的字符集中,Spring Boot 会在解析请求参数时抛出 UnsupportedCharsetException。此时,全局异常处理器将捕获该异常,并返回包含错误信息的 400 响应。

curl -v "http://localhost:8080/api/test?charset=INVALID_CHARSET"
执行上述 curl 命令后,服务器将返回如下响应:
HTTP/1.1 400 Bad Request Content-Type: text/plain;charset=UTF-8 Content-Length: 35 Unsupported charset: INVALID_CHARSET
这表明全局异常处理器成功捕获了字符集异常,并按照预期返回了错误信息。开发者可以通过这种方式统一处理所有与字符集相关的异常,确保应用程序的稳定性和用户体验。
基于程序中某个输入、条件或结果的具体问题
在实际开发中,可能会遇到一种情况:某些第三方库或框架内部也使用了特定的字符集解析逻辑,而这些逻辑可能不会抛出 UnsupportedCharsetException,而是抛出其他类型的异常,如 IllegalArgumentException。在这种情况下,全局异常处理器可能无法直接捕获这些异常。为了解决这个问题,可以在全局异常处理器中添加对 IllegalArgumentException 的捕获,并进一步检查其消息是否包含字符集相关的信息。这样可以更全面地处理各种与字符集相关的异常情况。


















