Как проверить несколько pojo с помощью весеннего валидатора?

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

Ниже приведен справочный код.

Controller

@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, то есть тестовое задание, похоже, перекрывает два других с сообщением об ошибке.

Предоставьте структуру вашего класса POJO, а также покажите полную трассировку стека сообщенной ошибки.

Javad Alimohammadi 14.09.2018 09:29

@ Джавад Алимохаммади: При чем здесь структура Pojo?

Hello World 17.09.2018 12:53

Некоторые ответы подталкивают пользователя OP к цели, но не полны. создание модели оболочки - хорошая идея. но после его создания вы должны использовать аннотацию @Valid для каждой модели в модели оболочки. похоже на это: public class WrapperModel { @Valid private Foo foo; @Valid private Bar bar; // ...}

Hadi J 22.09.2018 21:14
2
3
1 563
2

Ответы 2

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

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

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

«Параметры Errors или 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";

    }
}

но вопрос был в проверке нескольких pojo!

MohammadReza Alagheband 22.09.2018 08:53

@MohammadRezaAlagheband Обновил мой ответ, чтобы прояснить его.

Jade Devin Nocum Cabatlao 22.09.2018 09:01

@JadeDevinNocumCabatlao: Мой вопрос был в том, какое Pojo будет передано в методе валидатора в качестве аргумента.

Hello World 24.09.2018 07:12

One answer described in apply custom validator in spring MVC controller in more than one class if that does not help you can go with the following answer.

Наличие другой модели / PoJo для проверки не является хорошей идеей в spring mvc, я могу предложить создать класс-оболочку, который включает оба класса, и проверить его как единый класс.

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

class MyClass1 {
    // codes
}

class MyClass2 {
    // codes
}

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

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

теперь легко проверить этот единственный класс-оболочку.

Другие вопросы по теме