복붙노트

[SPRING] JSR-303과 Traditional Bean Validation 둘 다 사용 하시겠습니까?

SPRING

JSR-303과 Traditional Bean Validation 둘 다 사용 하시겠습니까?

스프링에서 JSR-303 빈 검증과 전통적인 검증 (유형에 대한 단일 유효성 검사기 클래스)을 모두 사용할 수 있습니까? 그렇다면 이것을 설정하는 데 필요한 구성은 무엇입니까?

내가 참조에 대한 지침을 시도했다.

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new DualEntryValidator());
}

@RequestMapping(value="/dualEntry.htm", method = RequestMethod.POST)
public ModelAndView handlePost(@Valid DualEntryForm form, BindingResult result) {
    ModelAndView modelAndView = new ModelAndView("dualEntry", getCommonModel());

    if (!result.hasErrors()){
        //do logic
        return modelAndView;

    }else {
        modelAndView.addObject("dualEntryForm", form);
        return modelAndView;
    }
}

내 사용자 정의 유효성 검사기 또는 JSR-303 유효성 검사를 사용할 수 있지만 두 가지를 모두 사용할 수는 없습니다. 예제 에서처럼 initBinder가 있으면 사용자 정의 유효성 검사기를 사용합니다. 제거하면 JSR-303 bean 유효성 검사가 사용됩니다. 어떻게 둘 다 사용할 수 있습니까?

해결법

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

    1.나는 여기에있는 지침에 따라 그것을했다.

    나는 여기에있는 지침에 따라 그것을했다.

    http://blog.jteam.nl/2009/08/04/bean-validation-integrating-jsr-303-with-spring/

    "Enjoy both worlds"섹션을 참조하십시오. 간단히 말해 Spring 유효성 검사기에서 JSR303 유효성 검사를 명시 적으로 실행하고 주석 및 사용자 정의 유효성 검사 논리를 기반으로 JSR303 유효성 검사 결과를 "결합"합니다.

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

    2.이 코드는 꽤 오래된 코드라는 것을 알았지 만 코드에 대한 최소한의 방해로 작동하도록했습니다.

    이 코드는 꽤 오래된 코드라는 것을 알았지 만 코드에 대한 최소한의 방해로 작동하도록했습니다.

    Change binder.setValidator (새로운 DualEntryValidator ());

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(new DualEntryValidator());
    }
    

    setValidator ()를 사용하면 JSR-303 유효성 검사기를 바꿀 것입니다. addValidator ()를 사용하면 JSR-303 유효성 검사기가 호출되므로 사용자도 JSR-303 유효성 검사기를 호출합니다.

    유효성 검사기가 JSR-303 @NotNull, @Min, @Max 등의 주석과 겹치지 않도록해야합니다. 그렇지 않으면 중복 된 오류 메시지가 추가됩니다.

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

    3.Spring은 bean 유효성 검사를 위해 세 개의 핸들을 제공한다.

    Spring은 bean 유효성 검사를 위해 세 개의 핸들을 제공한다.

    1.abstract 클래스 AbstractPropertyValidationAnnotationHandler

    2.abstract 클래스 AbstractMethodValidationAnnotationHandler

    3.abstract 클래스 ClassValidationAnnotationHandler

    이 예제에서는 custom annotation CustomAnnotationHandle을 구현하고 있습니다.

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
     Class CustomAnnotationHandle extends  Annotation{
    
        public abstract String value();
    
       }
    

    속성 검증을 위해 커스텀 어노테이션을 구현하려면 AbstractPropertyValidationAnnotationHandler 클래스를 확장해야합니다.

    AbstractPropertyValidationAnnotationHandler는 createValidationRule 추상 메소드를 제공합니다.

    protected abstract AbstractValidationRule createValidationRule(Annotation annotation, Class class1, String s); 
    

    따라서 확장 클래스는

    protected abstract AbstractValidationRule createValidationRule(Annotation annotation, Class class1, String s) 
    
    public class CustomPropertyAnnotationHandler extends AbstractPropertyValidationAnnotationHandler
    {
    
        public CustomPropertyAnnotationHandler()
        {
            super(new Class[] {
               XXX.XXX.PackageLevle.CustomAnnotationHandle // as it takes array of custom annotation ,so we can pass more than one 
            // overwriting abstract method
            protected  AbstractValidationRule createValidationRule(Annotation annotation, Class class1, String s){
                CustomAnnotationHandle value = (CustomAnnotationHandle)annotation;
                return TestValidationRule(value.getValue());
    
                // as you can see it return AbstractValidationRule.So, we need a class to give our bean specific validation rule.In our case it is 
    
                //TestValidationRule
            }
    
    
        }
    }
    
    public class TestValidationRule extends AbstractValidationRule
    {
    
        public TestValidationRule (String valuetest)
        {
         super();  
     this.valuetest = valuetest;
        }
    
    
    Private String valuetest;
    
    
    }
    

    Spring은 AnnotationBeanValidationConfigurationLoader 클래스를 제공합니다.이 클래스는 bean 유효성 검사를위한 스프링 자신의 주석에 사용됩니다.

    DefaultValidationAnnotationHandlerRegistry 클래스는 defaultHandlerRegistry로 사용됩니다. 그러나 우리 자신의 annotion을 제공해야한다면 우리는

    AnnotationBeanValidationConfigurationLoader를 확장하고 메서드를 통해 특정 핸들 레지스트리를 설정해야합니다. setHandlerRegistry (새 CustomPropertyAnnotationHandler ());

    DefaultValidationAnnotationHandlerRegistry 클래스는 bean 검증을 위해 스프링 자신의 주석을 등록하는 데 사용됩니다.

    SimpleValidationAnnotationHandlerRegistry 클래스의 registerPropertyHandler 메소드를 호출합니다. 우리가 필요로하는 커스텀 어노테이션

    SimpleValidationAnnotationHandlerRegistry 클래스의 registerPropertyHandler 메서드를 호출하여 CustomPropertyAnnotationHandler를 등록합니다.

    public class OurBeanSpecificValidationLoader extends AnnotationBeanValidationConfigurationLoader
    {
    
        public OurBeanSpecificValidationLoader ()
        {
    super();
            setHandlerRegistry(new OurSpecificAnnotationHandleRegistery ());
        }
    
    
    }
    
    public class OurSpecificAnnotationHandleRegistery extends DefaultValidationAnnotationHandlerRegistry
    {
    
        public OurSpecificAnnotationHandleRegistery ()
        {
            registerPropertyHandler(new CustomPropertyAnnotationHandler() );
        }
    }
    

    그래서 당신은 bean validation을위한 커스터마이징 주석을 가지고 있습니다.

      @CustomAnnotationHandle(value = "test")
        private Object test;
    
  4. from https://stackoverflow.com/questions/6835122/using-both-jsr-303-and-traditional-bean-validation by cc-by-sa and MIT license