Hibernate-валидатор Группы с Spring MVC
Я использую hibernate-валидатор 4.3.1 и Spring MVC 3.2.3.
У моего приложения есть бин со следующими свойствами и аннотациями (для простоты я удалил большинство из них):
public class Account {
@NotEmpty(groups = GroupOne.class)
private String name;
@NotEmpty(groups = GroupOne.class)
private Date creationDate;
@NotEmpty(groups = GroupTwo.class)
private String role;
@NotEmpty(groups = GroupTwo.class)
private String profile;
//getters and setters
}
Как показано, существует две группы проверок, потому что приложение имеет форму мастера, состоящую из двух этапов: на первом этапе поля name и creationDate заполняются пользователем, а на втором - поля роли и профиля.
Я добавляю некоторые методы контроллера в качестве примера:
@RequestMapping(value = "/account/stepOne", method = "POST")
public String stepOne(@ModelAttribute @Validated(GroupOne.class) Account account, BindingResult bindingResult) {
//Implementation
}
@RequestMapping(value = "/account/stepTwo", method = "POST")
public String stepTwo(@ModelAttribute @Validated(GroupTwo.class) Account account, BindingResult bindingResult) {
//Implementation
}
Вышеуказанные методы определяют, какая проверка должна применяться аннотацией @Validated.
До сих пор все работало нормально, но у меня есть некоторые проблемы, когда я хочу использовать этот компонент в другой форме. Эта форма отображает все поля компонента, и метод контроллера, который получает отправку, выглядит следующим образом:
@RequestMapping(value = "/account/stepOne", method = "POST")
public String stepOne(@ModelAttribute @Validated Account account, BindingResult bindingResult) {
//Implementation
}
Как вы можете видеть, имя группы было удалено из аннотации @Validated, потому что я хочу применить все проверки, определенные в компоненте Account.
Однако это не сработало, и единственный способ заставить его работать - добавить группу Default в свойства bean-компонента, как показано ниже:
public class Account {
@NotEmpty(groups = {GroupOne.class, Default.class})
private String name;
@NotEmpty(groups = {GroupOne.class, Default.class})
private Date creationDate;
@NotEmpty(groups = {GroupTwo.class, Default.class})
private String role;
@NotEmpty(groups = {GroupTwo.class, Default.class})
private String profile;
//getters and setters
}
Есть ли более элегантный способ добиться этого?
3 ответа
Нет более элегантного способа. Проверка без указания группы будет проверять группы по умолчанию. Следовательно, вы должны добавить его, как описано. Единственная альтернатива - явная проверка всех групп, которые вас интересуют, через @Validated({GroupOne.class, GroupTwo.class})
, Я думаю, это вопрос вкуса, что вы предпочитаете.
Если вы расширяете групповой интерфейс с помощью Default, он должен позаботиться о себе сам.
подобно
public interface Group1 extends Default {}
Вы можете использовать @Valid:
public ModelAndView myMethod(@ModelAttribute @Valid MyDto myDto, BindingResult result){
if(result.hasErrors()){
....
}