Mic*_*che 4 validation spring spring-3
我想使用Spring 3进行验证.
在参考文档中,第6.2节讨论了Validator
我们可以为要验证的类实现的接口.它解释了如何创建Validator
类,而不是如何验证对象.
第6.7节涉及JSR-303
API 的使用和附带的注释.它似乎是一种验证对象的不同方式(在这种情况下,使用注释而不创建Validator
类).
有两种方法可以使用Spring验证,或者我错过了什么?
一个简单的问题,它还规定JSR-303
了类路径上必须存在API 的实现.一个提议的实施是Hibernate-Validator
.Spring是否提供了实现?
谢谢
是的,有两种方法:
我建议使用JSR 303. - 在我看来,使用旧验证器的原因只有一个:那就是你需要大量的交叉字段验证,因为它们相对难以用JSR 303实现(但它是可能的)
要使用JSR 303,您需要添加一个验证器实现,例如Hibernate-Validator(它是JSR 303的默认实现)(Hibernate-Validator不是Hibernate ORM!,它只是相关的)
这有点像JPA,有常见的中性规范(javax.jpa/javax.validation)和不同的提供程序实现(例如JPA:EclipseLink或Hibernate)
这是一个如何测试验证的示例(测试的目标是测试验证本身,但我将Validator更改为常用验证器),无论如何它应该向您展示如何测试验证器:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
但是在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
}
}
Run Code Online (Sandbox Code Playgroud)
而UserCreateCommand只是一个POJO,其中的字段使用大量JSR303验证约束进行注释.
public class UserCreateCommand {
@Length(min = 2)
@NotBlank
private String login;
@Email
@NotNull
private String emailAddress;
....
//GETTER and SETTER
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7105 次 |
最近记录: |