Usos del validador SpringBoot

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

WebMvcAutoConfigurationSe obtendrá automáticamente al inicioValidator

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-XRz0SOoR-1672369985404)(/home/hhoa/snap/marktext/9/.config/marktext/images/2022-11-29-11-23-52-image.png)]

Al obtener un Validador, primero se obtendrá el Validador registrado, si no hay un Validador registrado, automáticamente se creará el Vaidator (nuevo OptionalValidatorFactoryBean())
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
El ValidatorAdapotr creado automáticamente no tendrá un Validador, como se muestra en la figura:

SpringValidator.java

inserte la descripción de la imagen aquí

Sin un validador, los datos no se pueden validar a medida que llegan

ConfigurableWebBindingInitializer.java

SpringValidatorAdapoer.java

inserte la descripción de la imagen aquí

¿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>

inserte la descripción de la imagen aquí


Cómo se verifica el validador

  1. Primero DispatcherServlet.java comienza a procesar datos

DispatcherServlet.java

  1. Luego comience a analizar los parámetros.

ManejadorMetodoArgumentoResolverCompuesto.java

inserte la descripción de la imagen aquí

  1. 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 directamenteinserte la descripción de la imagen aquí

  2. 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
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

  3. Después de inicializar DataBind, los parámetros deben analizarse y verificarse

    RequestReponseBodyMethodProcess.java

    inserte la descripción de la imagen aquí

  4. El proceso de verificación consiste en capturar primero todas las clases con anotaciones Validadas o Válidas

    AbstractMessageConverterMethodArgumentReslover.java

    inserte la descripción de la imagen aquí

    ValidationAnnotationUtils.java

    inserte la descripción de la imagen aquí

  5. spring-boot-starter-validationLuego 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

    inserte la descripción de la imagen aquí


spring-boot-starter-validation 包

  1. El controlador agrega la anotación @Validated

    inserte la descripción de la imagen aquí

  2. 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
  1. 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:

  1. Sitio web oficial de SpringBoot

Supongo que te gusta

Origin blog.csdn.net/HHoao/article/details/128492961
Recomendado
Clasificación