在“javax.validation 与 Spring Boot 集成”章节您应该发现了,javax.validation 默认给出来的异常信息很丑,如下图:
此时,为我们可以利用 Spring Boot 的全局异常捕获进行处理,将输出的错误信息进行格式化,例如:
package com.hxstrive.springboot.validation.handler; import com.hxstrive.springboot.validation.dto.CommonResult; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.List; import java.util.Optional; import java.util.Set; /** * 全局异常处理 * @author hxstrive.com * @since 1.0.0 2024/2/2 9:15 */ @ControllerAdvice @ResponseBody public class GlobalExceptionHandler { /** * 捕获 ConstraintViolationException 异常,并处理,该异常由验证框架抛出 */ @ExceptionHandler(value = {ConstraintViolationException.class}) public CommonResult<?> handleResourceNotFoundException(ConstraintViolationException e) { Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); StringBuilder strBuilder = new StringBuilder(); for (ConstraintViolation<?> violation : violations) { strBuilder.append(violation.getMessage()).append("\n"); } CommonResult<?> response = new CommonResult<>(); response.setState(false); response.setMessage(strBuilder.toString()); return response; } /** * 捕获 MethodArgumentNotValidException 异常,并处理,该异常由验证框架抛出 */ @ExceptionHandler(value = {MethodArgumentNotValidException.class}) public CommonResult<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); List<ObjectError> errorList = bindingResult.getAllErrors(); String message = null; if(!errorList.isEmpty()) { message = Optional.ofNullable(errorList.get(0)).map(ObjectError::getDefaultMessage).orElse(""); } CommonResult<?> response = new CommonResult<>(); response.setState(false); response.setMessage(Optional.ofNullable(message).orElse(e.getMessage())); return response; } /** * 搂底的异常处理,正常来讲不应该走到这里的,如果走到这里需要特别注意 */ @ExceptionHandler(value = Exception.class) public CommonResult<?> defaultErrorHandler(Exception e) { CommonResult<?> response = new CommonResult<>(); response.setState(false); response.setMessage("服务器错误,请稍后重试"); return response; } }
添加了全局异常捕获后,重启应用程序,再次使用 ApiFox 访问接口,输出的错误信息更具可读性,如下图: