복붙노트

[SPRING] JSR-303과 Spring Validator 클래스를 서비스 레이어에 결합하는 방법은 무엇입니까?

SPRING

JSR-303과 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 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에서이 규칙을 설명하지 않을 수 있습니까?

어떻게 작동하는지 알 수 있습니다 @ 스프링 컨트롤러에서 유효하지만 서비스 레이어는 무엇입니까? 가능한가? 적절한 방법으로 그러한 종류의 검증을 수행하는 방법은 무엇입니까? Hibernate Validator를 사용해야합니까?

해결법

  1. ==============================

    1.Spring은 두 가지 유효성 검사 API를 병합하기위한 어댑터를 제공합니다. 더 자세한 정보는 현재 Spring JavaDoc을 참조하십시오.

    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) {
          // ...
      }
    }
    
  2. from https://stackoverflow.com/questions/26501348/how-to-combine-jsr-303-and-spring-validator-class-in-a-service-layer by cc-by-sa and MIT license