2016-11-29 2 views
1

У меня есть собственный валидатор и зарегистрировать его в моем контроллереПонимания «globalValidator» в Spring MVC

@Controller 
public class MyController { 

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

    @RequestMapping("/foo", method=RequestMethod.POST) 
    public void processFoo(@Valid Foo foo) { ... } 

} 

, но я хочу, чтобы зарегистрироваться в других контроллерах также, так, чтобы иметь возможность просто написать @Valid и Foo объект, подлежащий проверке. Из того, что я вижу, я понимаю, что я могу использовать @ControllerAdviced класс, чтобы зарегистрировать валидатор на каждом контроллере или использовать

<mvc:annotation-driven validator="globalValidator"/> 

Но как зарегистрировать мой валидатор, как Spring понять, какие средства проверки я хочу сделать одну глобальную ? Сканирование для каждой реализации Validator класс? Могу ли я это сделать с помощью xml-конфигурации? Как использовать этот подход?

Я не понимаю, описание весной в:

В качестве альтернативы можно назвать setValidator (Validator) на глобальном WebBindingInitializer. Этот подход позволяет настроить экземпляр Validator для всех аннотированных контроллеров. Это может быть достигнуто путем с использованием пространства имен SpringMVC:

Xmlns = "http://www.springframework.org/schema/beans" Xmlns: = MVC "http://www.springframework.org/schema/" MVC XMLNS: XSI = "http://www.w3.org/2001/XMLSchema-instance" XSI: SchemaLocation =" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xss http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd «>

<mvc:annotation-driven validator="globalValidator"/> 
+0

валидатор с именем 'globalValidator' ... Или один с именем' fooBar', если вы пишете '' –

+0

Так что "globalValidator" это просто имя ранее созданного валидатора? Так что, если Iwan поместить двух из них в глобальную? – Xelian

+0

Вы не можете .. У вас может быть только один глобальный валидатор ... –

ответ

0

документации вполне ясно на Validation section:

В Spring MVC можно настроить для использования в качестве глобального валидатора экземпляра, который будет использоваться всякий раз, когда @Valid или @Validated контроллер метода аргумент встречается, и/или как местного валидатора в пределах контроллера через метод @InitBinder. Глобальный и локальный валидатор экземпляров может быть объединены для обеспечения композитного Validation

Если я правильно понимаю, в вашем примере FooValidator вы хотите использовать его на каждую проверку, как глобальный валидатор так определить его как фасоль и ввести его как вы показываете прямо в XML-записи mvc:annotation-driven, как вы уже показываете.

В дополнение к этому контроллеру вы можете использовать пользовательскую форму (применяемую сверху только на этих ответственных формах) через аннотацию @InitBinder.

В качестве примечания, в вашем @RequestMapping метода получения запроса POST, где ваш параметр @Valid: вы можете иметь BindingResult записи сразу после этого принимать решения по маршрутам и т.д.В вашем примере:

@RequestMapping("/foo", method=RequestMethod.POST) 
public String processFoo(@Valid Foo foo, BindingResult result) { 

    if(result.hasErrors()) { 
     return "go/that/way"; 
    } 
    //.. 
} 
Смежные вопросы