es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar la anotación para validar LocalDateTime en Spring Boot.

Estoy utilizando @Valid para validar los datos de RequestBod, ver abajo:

Controlador MemberController.java

public R<string> addMember(@Valid @RequestBody AddMemberVO memberVO) {
    ...
}

Modelo AddMemberVO.java

public class AddMemberVO{
    //Hora de inicio de la tarjeta de miembro
    private LocateDateTime startTime;

    //Hora de finalización de la tarjeta de miembro
    private LocateDateTime endTime;

    ...
}

Para esta API, quiero validar startTime y endTime utilizando anotaciones.

Todas las fechas utilizan el mismo formato yyyy-MM-dd HH:mm:ss.

Si se ingresa:

{
“startTime”:”2021-10-01 94:00:00″,
“EndTime”:”2021-10-01 14:00:00″
}
El resultado esperado es: el formato de startTime es inválido.

Si se ingresa:

{
“startTime”:”2021-19-01 00:00:00″,
“EndTime”:”2021-10-01 14:00:00″
}
El resultado esperado es: el formato de startTime es inválido.

Encontré una solución: cambiar startTime y endTime de LocalDateTime a String, pero no creo que sea una buena idea, porque si cambio esto, deberé hacer muchas cosas para convertir de String a LocalDateTime.

¿Hay alguna otra forma de validar esta escena utilizando LocalDateTime en mi código?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes crear una anotación de validación personalizada que valide el formato de fecha de los campos LocalDateTime en tu clase AddMemberVO. Aquí tienes un ejemplo de cómo podrías crear esa anotación:

    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = LocalDateTimeFormatValidator.class)
    public @interface LocalDateTimeFormat {
        String message() default "Formato de fecha y hora inválido";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    

    Esta anotación se puede aplicar a los campos de tu clase AddMemberVO de la siguiente manera:

    public class AddMemberVO{
        @LocalDateTimeFormat
        private LocalDateTime startTime;
    
        @LocalDateTimeFormat
        private LocalDateTime endTime;
    
        // ...
    }
    

    A continuación, necesitas implementar la clase LocalDateTimeFormatValidator para validar realmente el formato de los campos LocalDateTime. Aquí tienes un ejemplo de implementación:

    public class LocalDateTimeFormatValidator implements ConstraintValidator<localdatetimeformat, localdatetime=""> {
    
        private Pattern pattern;
    
        @Override
        public void initialize(LocalDateTimeFormat constraintAnnotation) {
            pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
        }
    
        @Override
        public boolean isValid(LocalDateTime value, ConstraintValidatorContext context) {
            if (value == null) {
                return true; // los valores nulos serán manejados por @NotNull o @NotBlank
            }
            String stringValue = value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            return pattern.matcher(stringValue).matches();
        }
    }
    

    Este validador comprueba que el formato del valor LocalDateTime coincida con el patrón especificado (“yyyy-MM-dd HH:mm:ss”). Puedes personalizar este patrón para que se ajuste a tus necesidades específicas.

    Con esta anotación de validación personalizada y el validador implementado, ahora puedes usar @Valid como antes para validar los datos de tu RequestBody:

    public R<string> addMember(@Valid @RequestBody AddMemberVO memberVO) {
        // ...
    }
    

    Cualquier error de validación se informará al cliente con el mensaje especificado (“Formato de fecha y hora inválido” por defecto).</localdatetimeformat,>

Comments are closed.