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,>
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étodocreateDisconnectRequestRest()
. 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í:
Al agregar
@Valid
antes del parámetroList<@CustomValidator RequestObj>
, la validación paraRequestObj
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.