Используете JSR-303 и традиционную проверку бинов? - PullRequest
10 голосов
/ 26 июля 2011

Можно ли использовать в Spring как валидация 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;
    }
}

Я могу заставить это использовать свой пользовательскийValidator или проверка JSR-303, но не обе.Если у меня есть initBinder, как в примере, он использует пользовательский Validator.Если я удаляю его, используется проверка bean-компонента JSR-303.Как я могу использовать оба ?

Ответы [ 3 ]

9 голосов
/ 29 июля 2011

Я сделал это, следуя инструкциям здесь:

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

См. Раздел «Наслаждайтесь обоими мирами».Вкратце, вы явно запускаете проверку JSR303 из валидатора Spring, «объединяя» результаты проверок JSR303 на основе аннотаций и собственной логики проверки.

8 голосов
/ 28 октября 2014

Я понимаю, что это довольно старый, но я получил это для работы с минимальным нарушением моего кода

Изменение binder.setValidator(new DualEntryValidator());

до

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

С setValidator() вы заменяете валидатор JSR-303 своим. С addValidator() вызывается валидатор JSR-303, как и ваш.

Вам необходимо убедиться, что ваш валидатор не перекрывается с вашими аннотациями JSR-303 @NotNull, @Min, @Max и т. Д., Иначе вы получите дублированные сообщения об ошибках.

1 голос
/ 15 апреля 2013

Spring предоставляет три дескриптора для проверки bean-компонента.

1.abstract класс AbstractPropertyValidationAnnotationHandler

2.abstract класс AbstractMethodValidationAnnotationHandler

3.abstract class ClassValidationAnnotationHandler

В этом примере я реализую пользовательскую аннотацию CustomAnnotationHandle

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
 Class CustomAnnotationHandle extends  Annotation{

    public abstract String value();

   }

Для реализации пользовательской аннотации для проверки свойства нам необходимо расширить AbstractPropertyValidationAnnotationHandler Class.

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 для представленияClass.Этот класс используется для собственной аннотации весны для проверки бина.

Класс DefaultValidationAnnotationHandlerRegistry используется в качестве defaultHandlerRegistry. Но если нам нужно предоставить собственное аннотирование, тогда нам

необходимо расширить AnnotationBeanValidationConfigurationLoader и установить нашу специальную дескрипторную регистрацию с помощью метода setHandlerRegistry (new )HenlerRegistry (new )Hernler (new )Property (new CustomHperty) (new CustomHperty);1033 *

Класс DefaultValidationAnnotationHandlerRegistry используется для регистрации собственной аннотации весны для проверки bean-компонента. Он регистрируется компонентом

, вызывая метод registerPropertyHandler класса SimpleValidationAnnotationHandlerRegistry. Поэтому для нашей пользовательской аннотации нам нужно

1038CustomPropertyAnnotationHandler с помощью вызова метода registerPropertyHandler класса SimpleValidationAnnotationHandlerRegistry
public class OurBeanSpecificValidationLoader extends AnnotationBeanValidationConfigurationLoader
{

    public OurBeanSpecificValidationLoader ()
    {
super();
        setHandlerRegistry(new OurSpecificAnnotationHandleRegistery ());
    }


}

public class OurSpecificAnnotationHandleRegistery extends DefaultValidationAnnotationHandlerRegistry
{

    public OurSpecificAnnotationHandleRegistery ()
    {
        registerPropertyHandler(new CustomPropertyAnnotationHandler() );
    }
}

, поэтому у вас есть пользовательская аннотация для оценки bean-компонента. Например,

  @CustomAnnotationHandle(value = "test")
    private Object test;
...