相关文章:
一、简介
Spring Framework 4.0支持Bean Validation 1.0 (JSR-303) 和 Bean Validation 1.1 (JSR-349),也适配Spring的Validator
接口。
关于把校验作为业务逻辑现在有许多不同的观点,Spring为校验(和数据绑定)提供了一种设计既不赞成也不反对那些观点。明确的校验不应该被绑在web层,应该是在容易发现的位置尽可能的插入任何可用的校验器。考虑以上的观点,Spring想了一个Validator
接口,可以普遍或者特定使用在应用程序的每个层面。
数据绑定会将用户输入动态的绑定到一个域模型(或者任何你用来处理用户输入的对象)。Spring提供了DataBinder
来准确的执行数据绑定。Validator
和DataBinder
一起组成了validation
包,它主要是用在MVC framework,但是并不局限于MVC。
二、Spring校验
Spring 3引进了许多增强到它的校验支持。首先JSR-303 Bean Validation API现在是完全支持的。Spring的DataBinder现在可以校验数据的同时绑定它们。Spring MVC支持声明式校验@Controller
输入。
2.1 JSR-303 Bean Validation API概览
JSR-303是为Java平台制定的约束声明和元数据标准化规范。你可以在域模型(实体类)的属性上使用注解式声明校验约束条件。你也可以定义自己的约束条件。
为了方便解释,我看来看一个PersonForm
模型:
public class PersonForm {
private String name;
private int age;
}
JSR-303允许你在这些属性前定义约束条件:
public class PersonForm {
@NotNull
@Size(max=64)
private String name;
@Min(0)
private int age;
}
当这个类的实例被一个JSR-303校验器校验时,这些约束条件将会被强制执行。
关于JSR-303/JSR-349的更多信息参考Bean Validation website
2.2 配置Bean Validation Provider
Spring完全支持Bean Validation API。包括方便的将JSR-303/JSR-349 Bean Validation provider作为一个Spring bean来使用。这允许你可以在任何时间将javax.validation.ValidatorFactory
或者javax.validation.Validator
注入到应用程序需要被验证的地方。
使用LocalValidatorFactoryBean
来配置一个默认的校验器作为一个Spring bean:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
LocalValidatorFactoryBean
同时实现了javax.validation.ValidatorFactory
、javax.validation.Validator
和org.springframework.validation.Validator
。你可以注入它们其中任何一个引用到需要执行校验逻辑的bean。
下面这个例子注入了一个javax.validation.Validator
的引用:
import javax.validation.Validator;
@Service
public class MyService {
@Autowired
private Validator validator;
2.3 Spring MVC 3 Validation
从Spring 3开始,Spring MVC可以自动校验@Controller
的输入。
2.3.1 触发@Controller输入校验
为了触发校验,只需简单的在输入参数前添加@Valid
注解:
@Controller
public class MyController {
@RequestMapping("/foo", method=RequestMethod.POST)
public void processFoo(@Valid Foo foo) { /* ... */ }
Spring MVC在数据绑定结束后会使用一个合适的校验器来进行校验。
注意:@Valid
注解是JSR-303 Bean Validation API的一部分,并不是Spring特有的结构。
你可以配置一个自定义的校验器或者使用JSR-303/JSR-349的校验器。
下面的例子使用自定义校验器:
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new FooValidator());
}
@RequestMapping("/foo", method=RequestMethod.POST)
public void processFoo(@Valid Foo foo,BindingResult bindingResult) { ... }
}
还可以配置一个全局的自定义校验器:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven validator="globalValidator"/>
</beans>
怎么实现自己的校验器可以看这里。
第二种方式是使用JSR-303/JSR-349的校验器,例如:Hibernate Validator。将他添加到你的classpath,Spring MVC会自动发现。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- JSR-303/JSR-349 support will be detected on classpath and enabled automatically -->
<mvc:annotation-driven/>
</beans>
验证的错误可以通过BindingResult
的getFieldError()
来获取字段的错误。
后续会补充下JSR-303的一些注解。