Да, есть два способа:
- Интерфейсы валидатора - это старые интерфейсы, в основном используемые весной 2
- JSR 303 является новым, его не существует, пока весна 2 былаbuild
Я бы порекомендовал использовать JSR 303. - На мой взгляд, есть только одна причина использовать старые валидаторы: это если вам нужно МНОЖЕСТВО валидаций между полями, потому что они относительно сложныреализовать с помощью JSR 303 (но это возможно)
Чтобы использовать JSR 303, необходимо добавить реализацию валидатора, например Hibernate-Validator (это реализация по умолчанию JSR 303) (Hibernate-Validator НЕHibernate ORM !, он только связан)
Это немного похоже на JPA, есть общая нейтральная спецификация (javax.jpa / javax.validation) и различные реализации провайдера (для JPA, например: EclipseLinkили Hibernate)
Это пример того, как проверить валидацию (цель теста состояла в том, чтобы проверить саму валидацию, но я изменил Validato(в общем случае), в любом случае он должен показать вам, как проверить валидатор:
public class NotEmptyTest {
public static class Demo {
@NotEmpty
String string;
public Demo(final String string) {
this.string = string;
}
}
@Test
public void testNotEmptysWithValid() {
/** given: a valid object */
Demo valid = new Demo("hallo Welt");
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
/** then there must not be any constraint violations */
AssertUtil.isEmpty(validator.validate(valid));
}
@Test
public void testNotEmptyInValid() {
/** given: an invalid object */
Demo valid = new Demo("");
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
/** then there must not be one constraint violation */
Set<ConstraintViolation<Demo>> result = validator.validate(valid);
AssertUtil.hasSize(1, result);
ConstraintViolation<Demo> firstItem = result.iterator().next();
Assert.assertEquals("{org.hibernate.validator.constraints.NotEmpty.message}",
firstItem.getMessageTemplate());
}
}
Но в Spring MVC Controller это намного проще, вам нужно всего лишь добавить @Valid
к вашему объекту командыпараметр и необходимо добавить параметр BindingResult
непосредственно после параметра объекта команды
@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(@Valid UserCreateCommand userCreateCommand,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
//show form again
} else {
//create user and
//redirect To Show user
}
}
А UserCreateCommand - это просто POJO, где поля снабжены множеством ограничений проверки JSR303.
public class UserCreateCommand {
@Length(min = 2)
@NotBlank
private String login;
@Email
@NotNull
private String emailAddress;
....
//GETTER and SETTER
}