Spring DTO валидация с использованием ConstraintValidator - PullRequest
0 голосов
/ 30 мая 2019

Используемый мной DTO аннотирован аннотациями javax.validation

Например

@JsonIgnoreProperties(ignoreUnknown = true)
public class StudentDTO {

@NotEmpty
private String name;

@Positive
private Long studentId;

}

Что делать, если мне нужно проверить с помощью ConstraintValidator for StudentDTO

1 Ответ

0 голосов
/ 31 мая 2019

Spring MVC имеет возможность автоматически проверять @Controller входы. В предыдущих версиях это было до разработчика, чтобы вручную вызвать логику проверки.

Но в вашем случае вы пытаетесь проверить объект DTO, в этом случае springboot может не привязывать ваш валидатор к вашей модели автоматически и вызывать validator. Так что в этом случае вам нужно будет вручную связать объект в валидатор.

или вы можете вручную вызвать валидатор для bean-компонента, например:

@AutoWired
Validator validator;
...

validator.validate(book);

Вы можете определить собственный валидатор в springboot для классов модели, если хотите, и использовать аннотации:

@Documented
@Constraint(validatedBy = CustomDataValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomDataConstraint {
    String message() default "Invalid data";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

и затем определите класс валидатора, например:

public class CustomDataValidator implements
  ConstraintValidator<CustomDataConstraint, String> {

    @Override
    public void initialize(CustomDataConstraint data) {
    }

    @Override
    public boolean isValid(String field,
      ConstraintValidatorContext cxt) {
        return field!= null;
    }

}

Ваш класс валидатора должен реализовывать интерфейс ConstraintValidator и должен реализовывать метод isValid для определения правил валидации, определения правил валидации могут быть любыми. Затем вы можете просто добавить аннотацию к своему полю, например: :

@CustomDataConstraint 
private String name;
...