Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证

时间:2022-09-03 08:59:26

一、概述

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

参考:

Spring3.1 对Bean Validation规范的新支持(方法级别验证)