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 especificar la validación de pedido en el cuerpo de una solicitud en el controlador Rest de Spring Boot.

Entonces tengo un “Rest Controller” en “Spring Boot” y para un punto final, necesito validar su “Request Body”.

Controller:

@RestController
@Validated
@RequestMapping("/my_endpoint")
public class WorkflowController {

    @PostMapping(value = "/blablabla/", consumes = MediaType.APPLICATION_JSON_VALUE)
    public List<object> createDisconnectRequestRest(@RequestBody List<@CustomValidator @Valid RequestObj> dtos) { // here at the validators is the question
        ... //nevermind
        return null;
    }
}

Objeto de solicitud:

@Data
public class RequestObj{

    private String comment;

    @NotNull // this @NotNull annotation validator is triggered AFTER the custom validator is done. I want this to be first validated and then the custom validator should take place
    private List<long> ids = new ArrayList<>();
}



@Target({FIELD, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = CustomValidator.class)
@Documented
public @interface ValidRequest {

    String message() default "Invalid request";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
public class CustomValidator implements ConstraintValidator<validrequest, requestobj=""> {

 // repositories, constructor 

    @Override
    public boolean isValid(RequestObj request, ConstraintValidatorContext constraintValidatorContext) {

         myRepository.findAllById(request.getIds()); // I want the @NotNull annotation validate the object before this custom validator

        return true;
    }
}

Aquí está el problema:

El primero en activarse es CustomValidator y luego se valida RequestObj. En otras palabras, la validación comienza con la anotación @CustomValidator y luego la anotación @Valid. Me gustaría que el primero en activarse sea la anotación @Valid (para que la anotación @NotNull valide el objeto primero) y luego CustomValidator debería hacer su trabajo. Por ejemplo, si el campo del cuerpo “ids” es NULL, me gustaría que CustomValidator ni siquiera comience ya que la validación ya ha fallado.</validrequest,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para cambiar el orden de validación en el código dado, la anotación @Valid debe colocarse antes de la anotación @CustomValidator en el método createDisconnectRequestRest(). Esto garantizaría que las anotaciones de validación incorporadas como @NotNull se ejecuten antes del validador personalizado.

    El código corregido se vería así:

    @PostMapping(value = "/blablabla/", consumes = MediaType.APPLICATION_JSON_VALUE)
    public List<object> createDisconnectRequestRest(@RequestBody @Valid List<@CustomValidator RequestObj> dtos) {
        ... //no importa
        return null;
    }
    

    Al agregar @Valid antes del parámetro List<@CustomValidator RequestObj>, la validación para RequestObj sería ejecutada primero antes del validador personalizado. Esto garantizaría que se ejecuten todas las anotaciones de validación incorporadas como @NotNull antes del validador personalizado.

Comments are closed.