Spring参考手册 3 校验,数据绑定和类型转换

翻译自Spring官方文档 4.1.2版本

相关文章:

一、简介

Spring Framework 4.0支持Bean Validation 1.0 (JSR-303) 和 Bean Validation 1.1 (JSR-349),也适配Spring的Validator接口。

关于把校验作为业务逻辑现在有许多不同的观点,Spring为校验(和数据绑定)提供了一种设计既不赞成也不反对那些观点。明确的校验不应该被绑在web层,应该是在容易发现的位置尽可能的插入任何可用的校验器。考虑以上的观点,Spring想了一个Validator接口,可以普遍或者特定使用在应用程序的每个层面。

数据绑定会将用户输入动态的绑定到一个域模型(或者任何你用来处理用户输入的对象)。Spring提供了DataBinder来准确的执行数据绑定。ValidatorDataBinder一起组成了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.ValidatorFactoryjavax.validation.Validatororg.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>

验证的错误可以通过BindingResultgetFieldError()来获取字段的错误。

后续会补充下JSR-303的一些注解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容