试用Spring 3.0对于JSR 303(bean validation)的支持
JSR 303是标准的bean validation框架, 还没有发布正式版,最新的版本是1.0CR5。通过JSR 303,我们可以为域模型里添加@NotNull, @Email等注解,然后在应用程序的不同层里使用这些注解对于域模型做验证。
JSR 303目前有两个实现,分别是agimatec-validation和Hibernate Validator 4.0,这二者目前都没有正式版,但是测试版已经可以使用了。
Spring 3.0刚刚发布了RC1版,里面提供了对于JSR303的初步支持,试了一下,感觉还不错。
测试程序使用maven, 用的是hibernate的实现。首先,需要在pom里加入相关依赖:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.CR5</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.0.CR1</version>
</dependency>
在Spring的配置文件里加入validator factory:
<bean id="validator" >
<property name="providerClass"
value="org.hibernate.validator.HibernateValidator"/>
</bean>
测试用的model:
public class User{
private String username;
@NotNull(message = "用户名不能为空!")
@Size(min = 3, max = 16, message = "用户名最少 {min}, 最大 {max} 个字符")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
测试用例:
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class TestValidator{
@Autowired
@Qualifier("validator")
private Validator validator;
@Test
public void testValidator(){
User user = new User();
user.setUsername("a");
Set<ConstraintViolation<User>> vals = validator.getInvalidValues(user);
Assert.assertEquals(1, vals.size());
}
}
运行 mvn test,测试通过。
update: 如果要配合Spring MVC合用,则需要在applicationContext里配置:
<bean>
<property name="webBindingInitializer">
<!-- Configures Spring MVC DataBinder instances -->
<bean>
<property name="validator" ref="validator" />
</bean>
</property>
</bean>
这样,对于标注为@Controller类里的@Valid标记的对象,Spring会自动做验证。


没有评论▼