Spring Boot 中实现全局异常捕获 + 多语言异常提示 2023-10-26 程序之旅 暂无评论 630 次阅读 # Spring Boot 中实现全局异常捕获 + 多语言异常提示 ## Spring Boot 中实现全局异常捕获 通过自定义异常处理器,实现全局异常捕获和处理。在Spring Boot中,可以通过自定义异常处理器来捕获全局的异常。通过实现`@ControllerAdvice`和`@ExceptionHandler`注解,可以统一处理Controller层抛出的异常,并返回自定义的错误信息。 具体实现方法: ```java @Slf4j // 使用Lombok库生成日志记录器 @ConditionalOnProperty(matchIfMissing = true, value = "global.exception.handler", havingValue = "true") // 根据属性条件自动配置该组件,如果属性不存在,默认匹配 @RestControllerAdvice // 表示这是一个全局异常处理器,用于处理控制器层抛出的异常 public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) // 捕获Exception类及其子类的异常 public Object baseException(HttpServletRequest request, HttpServletResponse response, Exception exception) { log.error("exception", exception); // 记录异常信息到日志 logInfo(exception); // 调用logInfo方法记录更多异常信息 response.setStatus(HttpStatus.OK.value()); // 设置HTTP响应状态码为200 OK return createResultVO(msg, request, exception.getMessage()); // 创建并返回一个ResultVO对象 } // 创建一个ResultVO对象,用于封装异常信息 private ResultVO createResultVO(String msg, HttpServletRequest request, String extInfo) { ResultVO result = new ResultVO<>(); result.setResult(Constant.ERROR); // 设置结果为错误 result.setMsg(msg); // 设置错误消息 return result; } } ``` > `@ConditionalOnProperty` 是 Spring 框架中的一个条件注解,用于基于应用程序配置属性的值来决定是否应该加载或启用一个特定的组件或配置。 > > - `matchIfMissing`:默认值为 `true`,表示如果属性未在配置文件中找到,也将满足条件。如果设置为 `false`,则属性不存在时不满足条件。 > - `value`:指定要检查的属性的名称。这是必需的配置项。该值为 .yml 的配置。 > - `havingValue`:指定属性的期望值。只有当属性的值等于此配置的值时,条件才会满足。如果未提供此配置项,默认为`true`。 ## 多语言异常提示 通过国际化资源文件,实现多语言异常提示信息的配置和显示。在Spring Boot中,可以使用国际化资源文件来实现多语言异常提示信息的配置和显示。通过在配置文件中配置不同语言的异常提示信息,然后在代码中使用`getPropertiesSource`来获取对应语言的异常信息,从而实现多语言的异常提示。 具体实现如下: ```java // 创建一个处理 BindException 异常的控制器方法 @ExceptionHandler(BindException.class) public Object bindException(HttpServletRequest request, HttpServletResponse response, BindException bindException) { // 从 BindException 中获取 BindingResult,其中包含了验证错误的信息 BindingResult result = bindException.getBindingResult(); // 获取第一个字段错误的默认消息 String defaultMessage = result.getFieldErrors().get(0).getDefaultMessage(); // 设置响应状态码为 200 OK response.setStatus(HttpStatus.OK.value()); // 使用 I18nHelper.getPropertiesSource() 方法获取国际化消息 String msg = I18nHelper.getPropertiesSource(defaultMessage); // 调用 createResultVO 方法创建一个包含消息的结果对象,并将请求和空字符串传递给它 return createResultVO(msg, request, ""); } ``` ## 实际使用 Controller 中 ```java @ApiOperation(value = "测试接口", notes = "") @PostMapping(value = "/test") public ResultVO test(@Validated({Query.class}) @RequestBody TestDTO dto) { return ...; } ``` Query 是自定义的接口类。 在 TestDTO 中成员变量的注解 ```java @NotBlank(message = "00000000001", groups = {Query.class, Query.class}) private String prjCode; ``` 如果请求接口 /test,并且 prjCode 给的是 null,那么会返回 00000000001 对应的错误信息。 打赏: 微信, 支付宝 标签: java 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。