복붙노트

[SPRING] 수동으로 Spring Annotation Validation 호출

SPRING

수동으로 Spring Annotation Validation 호출

나는 Hibernate와 Spring Annotation으로 우리의 검증을 많이하고있다.

public class Account {
    @NotEmpty(groups = {Step1.class, Step2.class})
    private String name;

    @NotNull(groups = {Step2.class})
    private Long accountNumber;

    public interface Step1{}
    public interface Step2{}
}

그리고 컨트롤러에서 그것은 인수에서 호출됩니다 :

public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
   //some more code and stuff here
   return "";
}

그러나 나는 컨트롤러 방법에서 어떤 논리를 기반으로 사용되는 그룹을 결정하고 싶습니다. 유효성 검사를 수동으로 호출하는 방법이 있습니까? result = account.validate (Account.Step1.class)와 같은 결과가 나타 납니까?

나 자신의 Validator 클래스를 만드는 것에 대해 알고있다.하지만 그것은 피하고 싶다. 클래스 변수 자체에 주석을 사용하는 것을 선호한다.

해결법

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

    1.그의 대답에 Jaiwo99보다 더 한 걸음 나아 가기 :

    그의 대답에 Jaiwo99보다 더 한 걸음 나아 가기 :

    // org.springframework.validation.SmartValidator - implemented by
    //     LocalValidatorFactoryBean, which is funny as it is not a FactoryBean per se (just saying)
    @Autowired
    SmartValidator validator;
    
    public String saveAccount(@ModelAttribute Account account, BindingResult result) {
        // ... custom logic
        validator.validate(account, result, Account.Step1.class);
        if (result.hasErrors()) {
            // ... on binding or validation errors
        } else {
            // ... on no errors
        }
        return "";
    }
    

    관심이 있다면 SmartValidator JavaDoc에 대한 필수 링크.

  2. ==============================

    2.다음은 JSR 303 스펙의 코드 샘플입니다.

    다음은 JSR 303 스펙의 코드 샘플입니다.

    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    
    Driver driver = new Driver();
    driver.setAge(16);
    Car porsche = new Car();
    driver.setCar(porsche);
    
    
    Set<ConstraintViolation<Driver>> violations = validator.validate( driver );
    

    그래서 네, 유효성 검사기 팩토리에서 유효성 검사기 인스턴스를 얻고 유효성 검사를 직접 실행 한 다음 위반이 있는지 여부를 확인하십시오. Validator에 대한 javadoc에서 유효성을 검사 할 그룹 배열을 받아 들일 수 있습니다.

    명백히 Spring 유효성 검사 대신 JSR-303 유효성 검사를 직접 사용하지만 스프링 유효성 검사 주석이 클래스 경로에있는 JSR-303을 사용한다고 생각합니다.

  3. ==============================

    3.모든 것을 올바르게 구성했다면 다음과 같이 할 수 있습니다.

    모든 것을 올바르게 구성했다면 다음과 같이 할 수 있습니다.

    @Autowired
    Validator validator;
    

    그런 다음이를 사용하여 객체의 유효성을 검사 할 수 있습니다.

  4. ==============================

    4.그리고 또한:

    그리고 또한:

    @Autowired
    @Qualifier("mvcValidator")
    Validator validator;
    
    ...
    violations = validator.validate(account);
    
  5. from https://stackoverflow.com/questions/19190592/manually-call-spring-annotation-validation by cc-by-sa and MIT license