【问题标题】:How to combine JSR-303 and Spring Validator class in a service layer?如何在服务层中结合 JSR-303 和 Spring Validator 类?
【发布时间】:2014-10-22 06:17:29
【问题描述】:

我有一些模型类

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-controllers 中是如何工作的,但是关于服务层呢?可能吗?如何以适当的方式进行这种验证?我可以使用 Hibernate Validator 吗?

【问题讨论】:

    标签: spring bean-validation service-layer spring-validator


    【解决方案1】:

    Spring 提供了一个适配器来合并两个验证 API。 有关详细信息,请参阅当前 Spring JavaDoc

    一个可能的实现是

    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) {
          // ...
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2016-12-24
      • 2018-08-15
      • 1970-01-01
      相关资源
      最近更新 更多