Я использую аннотации @NullValue и собственный валидатор для условной проверки. Введенные данные недействительны, если тип атрибута – A, а имя атрибута пусто.
Но я не могу заставить работать валидатор.
У меня есть этот контроллер:
Код: Выделить всё
@RestController
@RequestMapping("/orders")
@Validated
public class OrderController {
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void createOrder(@Valid @RequestBody Order order) {
// do something
}
}
Код: Выделить всё
@Component
public class OrderValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return Order.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
final var order = (Order) target;
if (order.getType() == Type.A && Strings.isEmpty(order.getName())) {
errors.rejectValue("name", "name.required", "Name required for type A");
}
}
}
Код: Выделить всё
@Getter
@Setter
public class OrderDto {
private String name;
@NotNull
private Type type;
}
< strong>Но когда я отправляю запрос POST с типом=
Код: Выделить всё
AКод: Выделить всё
nullТочки останова подтверждают, что методы support и validate не вызываются. Но я могу внедрить bean-компонент OrderValidator, что означает, что компонент был найден Spring Boot.
Единственным обходным решением, которое я нашел, было использование его в качестве контроллера, но мне это кажется неправильным:
Код: Выделить всё
@RestController
@RequestMapping("/orders")
@Validated
public class OrderController {
@Autowired
private final OrderValidator orderValidator;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addValidators(orderValidator);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void createOrder(@Valid @RequestBody Order order, BindingResult result) {
// evaluate bindingResult manually
// do something
}
}
Подробнее здесь: https://stackoverflow.com/questions/762 ... omatically
Мобильная версия