公司封装了本身的基础核心包core-base,里边包含了Validation的异常捕获处理类;同时开发项目有全局异常捕获处理类,经测试发现,core-base里边的不起做用html
import com.dangbo.entity.ResultDTO; import com.dangbo.enums.ResultCode; import java.util.stream.Collectors; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) public class ValidationExceptionHandler { @ExceptionHandler({MethodArgumentNotValidException.class}) public ResultDTO MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors(); String messages = fieldErrors.stream() .map(o -> o.getDefaultMessage()) .collect(Collectors.joining(",")); return ResultDTO.error(ResultCode.HTTP_INTERNAL_SERVER_ERROR, messages); } @ExceptionHandler({BindException.class}) public ResultDTO BindExceptionHandler(BindException e) { List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors(); // 多个参数校验时,默认返回全部的错误结果 String messages = fieldErrors.stream() .map(o -> o.getDefaultMessage()) .collect(Collectors.joining(",")); return ResultDTO.error(ResultCode.HTTP_INTERNAL_SERVER_ERROR, messages); } @ExceptionHandler({ConstraintViolationException.class}) public ResultDTO ConstraintViolationExceptionHandler(ConstraintViolationException e) { Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations(); String messages = constraintViolations.stream() .map(o -> o.getMessage()) .collect(Collectors.joining(",")); return ResultDTO.error(ResultCode.HTTP_INTERNAL_SERVER_ERROR, messages); } } // 通用配置 import org.hibernate.validator.HibernateValidator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; /** * validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数 * 经过这个配置改为:校验参数时只要出现校验失败的状况,就当即抛出对应的异常,结束校验,再也不进行后续的校验 */ @Configuration public class ValidationConfig { @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() //failFast的意思只要出现校验失败的状况,就当即结束校验,再也不进行后续的校验。 .failFast(true) .buildValidatorFactory(); return validatorFactory.getValidator(); } @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(validator()); return methodValidationPostProcessor; } }