Весенняя загрузка пользовательской проверки - PullRequest
0 голосов
/ 29 марта 2020

У меня есть объект модели, для проверки которого требуется более сложная логика c, включающая вызов компонента службы. Я попытался реализовать следующим образом:

public class RequestModuleEntryValidator implements Validator {
    /*
     * A service
     */
    private final MyService myService;

    /*
     * Constructor for the module request validator
     */
    @Autowired
    public RequestModuleEntryValidator(MyService myService) {
        this.myService= myService;
    }

    /*
     * Checks if the validator supports the given class
     */
    @Override
    public boolean supports(Class<?> aClass) {
        return RequestModuleEntry.class.equals(aClass);
    }

    /*
     * Validates the given module request
     * @param o The module request entry object
     * @param errors The errors object
     * @return Nothing
     */
    @Override
    public void validate(Object o, Errors errors) {
// Call to my service...
}

Но у меня есть предупреждение:

Члены Autowired определены как недопустимые Spring Bean

Так что мой вопрос Как я могу реализовать пользовательскую проверку, соответствующую аннотации @Valid, когда эта проверка должна вызывать некоторые методы службы для принятия решения, действительны ли данные модели ...

1 Ответ

0 голосов
/ 29 марта 2020

Для создания пользовательского валидатора вы можете реализовать интерфейс ConstraintValidator.

Для этого вам необходимо создать пользовательскую аннотацию и аннотировать класс вашей модели этой аннотацией.

Затем создать свой класс валидатора RequestModuleEntryValidator , который реализует интерфейс ConstraintValidator и переопределяет метод isValid (), как показано ниже:

Ваш метод контроллера может выглядеть следующим образом:

public ResponseEntity<AnyObject> controllerMethod(@Valid @RequestBody PojoObject) {
.....
}

Ваш объект модели будет выглядеть следующим образом:

@ValidPojoRequest // Custom Annotation
public class PojoObject {
 ....with all properties 
}

Пользовательский класс аннотации будет выглядеть следующим образом:

@Target({TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PojoValidator.class)
public @interface ValidCancelRequest {
  Class<?>[] groups() default {};
  String message() default "{com.pojodetailvalidation.message}";
  Class<? extends Payload>[] payload() default {};
}

И тогда ваш файл PojoValidator. java будет выглядеть следующим образом:

public class PojoValidator implements ConstraintValidator<ValidPojoRequest,PojoObject> {

  @AutoWired 
  private MyService service;

  public boolean isValid(PojoObject request, ConstraintValidatorContext context) {
   // Call to your Service and check whether all conditions satisfy and accordingly return a boolean value.
//You can also return a proper error message for a particular property in your Pojo class by adding below 
  context.buildConstraintViolationWithTemplate("any message you wan to show to the one consuming your api").addConstraintViolation();
  context.disableDefaultConstraintViolation();
  return false;
  }
}

isValid () метод возвращает логическое значение, если он возвращает ложь, тогда проверка не проходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...