Usos del validador SpringBoot
Se prefiere la documentación oficial: https://docs.spring.io/spring-boot/docs/2.7.6/reference/htmlsingle/
Registro de validador
WebMvcAutoConfiguration
Se obtendrá automáticamente al inicioValidator
Al obtener un Validador, primero se obtendrá el Validador registrado, si no hay un Validador registrado, automáticamente se creará el Vaidator (nuevo OptionalValidatorFactoryBean())
El ValidatorAdapotr creado automáticamente no tendrá un Validador, como se muestra en la figura:
SpringValidator.java
Sin un validador, los datos no se pueden validar a medida que llegan
ConfigurableWebBindingInitializer.java
SpringValidatorAdapoer.java
¿Por qué no se puede verificar? Explicamos esto más adelante.
Entonces, si desea usar la función Validator, debe usar la dependencia oficial o personalizar el Validator.
Gradle
implementation org.springframework.boot:spring-boot-starter-validationspring-boot-starter-validation
experto
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Cómo se verifica el validador
- Primero DispatcherServlet.java comienza a procesar datos
DispatcherServlet.java
- Luego comience a analizar los parámetros.
ManejadorMetodoArgumentoResolverCompuesto.java
-
Al analizar parámetros, es necesario crear un WebDataBind para analizar y vincular datos [Falló la transferencia de imagen de enlace externo, el sitio de origen puede tener un mecanismo anti-leeech, se recomienda guardar la imagen y cargarla directamente
-
DataBind debe inicializarse después de la creación, y Validator debe configurarse durante la inicialización, y la condición para configurar Validator es la función de soporte mencionada anteriormente
-
Después de inicializar DataBind, los parámetros deben analizarse y verificarse
RequestReponseBodyMethodProcess.java
-
El proceso de verificación consiste en capturar primero todas las clases con anotaciones Validadas o Válidas
AbstractMessageConverterMethodArgumentReslover.java
ValidationAnnotationUtils.java
-
spring-boot-starter-validation
Luego verifique la clase capturada, y la verificación se realiza a través del Validator registrado anteriormente (Bean Validator personalizado o paquete oficial , etc.), por lo que no diré mucho aquí.DataBinder.java
spring-boot-starter-validation 包
-
El controlador agrega la anotación @Validated
-
Restricciones de adición de frijoles
public class AmsArticle implements Serializable { @Size(min = 2) private String title; }
anotación | Función |
---|---|
@afirmarfalso | Puede ser nulo, si no es nulo debe ser falso |
@afirmarverdadero | Puede ser nulo, si no es nulo debe ser verdadero |
@DecimalMax | El ajuste no puede exceder el máximo |
@DecimalMin | El ajuste no puede exceder el mínimo |
@Digits | La configuración debe ser un número y la cantidad de dígitos del número entero y la cantidad de lugares decimales deben estar dentro del rango especificado |
@Futuro | La fecha debe estar en el futuro de la fecha actual |
@Pasado | La fecha debe estar en el pasado de la fecha actual |
@Max | no debe exceder este máximo |
@Min | El máximo no debe ser inferior a este mínimo. |
@No nulo | No puede ser nulo, puede estar vacío |
@Nulo | debe ser nulo |
@Patrón | debe satisfacer la expresión regular especificada |
@Tamaño | El valor size() de colecciones, arreglos, mapas, etc. debe estar dentro del rango especificado |
@Correo electrónico | Debe estar en formato de correo electrónico |
@Longitud | La longitud debe estar dentro del rango especificado |
@NoBlank | La cadena no puede ser nula y la cadena trim() no puede ser igual a "" |
@No vacío | No puede ser nulo, y el tamaño() de colecciones, arreglos, mapas, etc. no puede ser 0; la cadena trim() puede ser igual a "" |
@Rango | El valor debe estar dentro del rango especificado |
@URL | debe ser una URL |
-
Manejo global de ValidateException
public class GlobalExceptionHandler { /** * 处理Validated校验异常 * <p> * 注: 常见的ConstraintViolationException异常, 也属于ValidationException异常 * * @param e * 捕获到的异常 * @return 返回给前端的data */ @ResponseStatus(code = HttpStatus.BAD_REQUEST) @ExceptionHandler(value = { BindException.class, ValidationException.class, MethodArgumentNotValidException.class}) public Map<String, Object> handleParameterVerificationException(Exception e) { log.error(" handleParameterVerificationException has been invoked", e); Map<String, Object> resultMap = new HashMap<>(4); resultMap.put("code", "100001"); String msg = null; if (e instanceof MethodArgumentNotValidException) { BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult(); // getFieldError获取的是第一个不合法的参数(P.S.如果有多个参数不合法的话) FieldError fieldError = bindingResult.getFieldError(); if (fieldError != null) { msg = fieldError.getDefaultMessage(); } } else if (e instanceof BindException) { // getFieldError获取的是第一个不合法的参数(P.S.如果有多个参数不合法的话) FieldError fieldError = ((BindException) e).getFieldError(); if (fieldError != null) { msg = fieldError.getDefaultMessage(); } } else if (e instanceof ConstraintViolationException) { /* * ConstraintViolationException的e.getMessage()形如 * {方法名}.{参数名}: {message} * 这里只需要取后面的message即可 */ msg = e.getMessage(); if (msg != null) { int lastIndex = msg.lastIndexOf(':'); if (lastIndex >= 0) { msg = msg.substring(lastIndex + 1).trim(); } } /// ValidationException 的其它子类异常 } else { msg = "处理参数时异常"; } resultMap.put("msg", msg); return resultMap; } }
otro
Documentación Oficial...
referencia: