Как проверить несколько POJO, используя пружинный валидатор? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть одна форма, для которой есть три Pojo, потому что есть три отдельные таблицы по одной для каждого Pojo. Два поля в форме предварительно заполнены. Теперь я хочу проверить форму с помощью пружинного валидатора. Я попытался использовать абстрактный класс с общими полями всех трех Pojo и каждого Pojo, расширяющего его, но Spring не смог создать Object для абстрактного класса и вывел исключение. Я предпочитаю не использовать интерфейс, так как мне нужно инициализировать все поля.

Ниже приведен код ссылки.

Контроллер

@RequestMapping(value="/save",method=RequestMethod.POST)
public String saveData(@ModelAttribute("commonForm")@Valid Foo foo,FooBar fooBar,Test test,BindingResult result){

    this.testValidator.validate(foo, result); //which Pojo to provide here
    if(result.hasErrors()){
        return "redirect:/regPage";
    }else{
        return "success";

    }
}

Validator

public class TestValidator implements Validator{

@Override
public boolean supports(Class<?> clazz) {

    return Foo.class.equals(clazz)|| FooBar.class.equals(clazz)|| Test.class.equals(clazz);
}


@Override
public void validate(Object target, Errors errors) {

    if(target instanceof Foo){

        //validate Foo...

    }else if(target instanceof FooBar){

        //validate FooBar...
    }else{

        //validate Test...
     }
   }
 }

Кроме того, последний тест Pojo, т.е. тест , похоже, перекрывает два других с сообщением об ошибке.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Один ответ, описанный в , применяет пользовательский валидатор в MVC-контроллере Spring в нескольких классах , если это не помогает, вы можете перейти к следующему ответу.

В Spring mvc не рекомендуется использовать другую модель / PoJo для проверки, поэтому я могу предложить создать класс-оболочку, включающий оба класса, и проверить его как один класс.

Представьте, что выhave:

class MyClass1 {
    // codes
}

class MyClass2 {
    // codes
}

Вы должны создать:

class WrapperClass {
    private Class1 class1;
    private Class2 class2;
    // getter & setters
}

Теперь этот класс-оболочку легко проверить.

0 голосов
/ 22 сентября 2018

В вашем контроллере вам нужно инициализировать валидатор через связыватель.

@InitBinder
public void InitBinder(WebdataBinder binder){
 binder.addValidators(new TestValidator())
}

Вы также должны поместить BindingResult после модели, которую вы хотите проверить.

"TheОшибки или параметры BindingResult должны следовать за объектом модели, который привязывается немедленно, поскольку сигнатура метода может иметь более одного объекта модели, и Spring создаст отдельный BindingResult "- Из документов Spring

Так что в вашем случае этодолжно было быть.

@RequestMapping(value="/save",method=RequestMethod.POST)
public String saveData(@ModelAttribute("commonForm")@Valid Foo foo, BindingResult resultFoo, @Valid FooBar fooBar, BindingResult resultFooBar, @Valid Test test, BindingResult resultTest){

    if(resultFoo.hasErrors() || resultFooBar.hasErrors() || resultTest.hasErrors()){
        return "redirect:/regPage";
    }else{
        return "success";

    }
}
...