一、概述
JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下:
1、依赖注入验证
2、方法级别验证
二、依赖注入验证
spring提供BeanValidationPostProcessor用于支持依赖注入验证,使用如下:
配置
<bean class="org.springframework.validation.beanvalidation.BeanValidationPostProcessor"> <property name="validator" ref="validator"/> </bean>
# format.properties msg.size=测试{min}+++
补充:validator配置同 Spring MVC 使用介绍(十三)数据验证 (一)基本介绍
实体
public class Person { @Size(min = 5, message = "{msg.size}") private String name; ... }
bean注入
<bean id="person" class="cn.matt.entity.Person"> <property name="name" value="asdf" /> </bean>
启动spring,此时启动失败,报错如下:
Bean state is invalid: name - 测试5+++
三、方法级别验证
方法级别验证可对方法的传参和返回值进行验证,spring提供MethodValidationPostProcessor用于支持该功能,使用如下:
配置
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"> <property name="validator" ref="validator"/> </bean>
业务类
@Service @Validated // 开启方法级别验证,使用@Valid无效,可设置方法默认分组 public class PersonService { public @Min(1) int getAge(@Size(min = 5, message = "{msg.size}") String name) { return 2; } }
注:对于参数为对象的类型进行递归验证,须使用@Valid,使用@Validated无效
测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring-context.xml") public class ValidTest { @Autowired private PersonService testService; @Test(expected = ConstraintViolationException.class) public void test1() { testService.getAge("assd"); } }
四、在spring mvc中使用
由于父上下文中的BeanPostProcessor无法作用于子上下文,子上下文中的BeanPostProcessor也无法作用于父上下文,因此如需同时对service层与controller层的方法或注入进行校验,须分别配置BeanValidationPostProcessor、MethodValidationPostProcessor
参考: