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.

Convertir cadenas a enteros inmediatamente en Hibernate-Validator después de una verificación exitosa de @Digits.

Tengo un recurso JAX-RS en Quarkus cuyas entradas quiero validar. Una de las propiedades en esta clase de validación a continuación, que validará la entrada de un método PUT, contiene una propiedad que se espera que sea un número.

public class UpdateBookDTO {

    public Optional<@Length(min = 2, max = 100) String> title;
    public Optional<@Length(min = 2, max = 100) String> author;
    public Optional<@Positive @Digits(fraction = 0, integer = 10) String> pages;

    @Override
    public String toString() {
        return "UpdateBookDTO{" +
                "title=" + title +
                ", author=" + author +
                ", pages=" + pages +
                '}';
    }
}

Sin embargo, dado que la anotación @Digits no funciona con el tipo de dato Integer, tengo que usar un String. El problema con esto, por supuesto, es que requiere un paso adicional de conversión. ¿Puedo, y cómo puedo hacer esto directamente en la clase de validación con alguna anotación “mágica”, o esto no es posible?

¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay una anotación “mágica” que te permita validar y analizar directamente la entrada numérica en tu bean de validación. Dado que la anotación @Digits solo funciona con el tipo de dato String, necesitarás agregar un paso adicional para analizar la entrada en un entero después de que haya sido validado.

    Una forma de hacer esto es agregar un método personalizado a tu bean de validación que realice el análisis. Por ejemplo, podrías agregar un método así:

    public Integer getPagesAsInt() {
        return pages.map(Integer::parseInt).orElse(null);
    }
    

    Este método utiliza la función map de la clase Optional para aplicar el método parseInt a la variable pages opcional, devolviendo un objeto Integer o null si el opcional está vacío.

    Luego puedes utilizar este método para obtener el valor entero analizado en tu método del recurso:

    @PUT
    public Response updateBook(@Valid UpdateBookDTO dto) {
        Integer pages = dto.getPagesAsInt();
    
        // hacer algo con el valor entero analizado
    
        return Response.ok().build();
    }
    

    Al utilizar este enfoque, puedes asegurarte de que la entrada numérica se valide y analice correctamente, al mismo tiempo que mantienes tu bean de validación simple y legible.

Comments are closed.