如何在服务层中组合JSR-303和Spring验证程序类?

如何在服务层中组合JSR-303和Spring验证程序类?,spring,bean-validation,service-layer,spring-validator,Spring,Bean Validation,Service Layer,Spring Validator,我有一些模型课 public class Account { @Email private String email; @NotNull private String rule; } 和弹簧验证器 public class AccountValidator implements Validator { @Override public boolean supports(Class aClass) { return Accou

我有一些模型课

public class Account {

    @Email
    private String email;

    @NotNull
    private String rule;
}
和弹簧验证器

public class AccountValidator implements Validator {

    @Override
    public boolean supports(Class aClass) {
        return Account.class.equals(aClass);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        Account account = (Account) obj;
        ValidationUtils.rejectIfEmpty(errors, "email", "email.required");
        ValidationUtils.rejectIfEmpty(errors, "rule", "rule.required");

        complexValidateRule(account.getRule(), errors);
    }

    private void complexValidateRule(String rule, Errors errors) {
        // ...
    }
}
我为自己服务

AccountValidator validator = new AccountValidator();
Errors errors = new BeanPropertyBindingResult(account, "account");
validator.validate(account, errors);
我可以将@Email、@NotNull(JSR-303)添加到我的验证过程约束中,并且不在AccountValidator中描述这些规则吗


我知道@Valid在spring控制器中是如何工作的,但关于服务层呢?可能吗?如何以适当的方式进行此类验证?我可以使用Hibernate验证程序吗?

Spring提供了一个适配器来合并两个验证API。 有关更多信息,请参见当前的Spring

一种可能的实施方式是:

public class AccountValidator implements Validator {

  private final SpringValidatorAdapter validator;

  public AccountValidator(SpringValidatorAdapter validator) {
      super();
      this.validator = validator;
  }

  @Override
  public boolean supports(Class aClass) {
      return Account.class.equals(aClass);
  }

  @Override
  public void validate(Object obj, Errors errors) {

      //jsr303
      validator.validate(obj, errors);

      //custom rules
      Account account = (Account) obj;
      complexValidateRule(account.getRule(), errors);
  }

  private void complexValidateRule(String rule, Errors errors) {
      // ...
  }
}