Spring參考手冊 3 校驗,數(shù)據(jù)綁定和類型轉(zhuǎn)換

翻譯自Spring官方文檔 4.1.2版本

相關(guān)文章:

一、簡介

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

關(guān)于把校驗作為業(yè)務(wù)邏輯現(xiàn)在有許多不同的觀點,Spring為校驗(和數(shù)據(jù)綁定)提供了一種設(shè)計既不贊成也不反對那些觀點。明確的校驗不應(yīng)該被綁在web層,應(yīng)該是在容易發(fā)現(xiàn)的位置盡可能的插入任何可用的校驗器??紤]以上的觀點,Spring想了一個Validator接口,可以普遍或者特定使用在應(yīng)用程序的每個層面。

數(shù)據(jù)綁定會將用戶輸入動態(tài)的綁定到一個域模型(或者任何你用來處理用戶輸入的對象)。Spring提供了DataBinder來準確的執(zhí)行數(shù)據(jù)綁定。ValidatorDataBinder一起組成了validation包,它主要是用在MVC framework,但是并不局限于MVC。

二、Spring校驗

Spring 3引進了許多增強到它的校驗支持。首先JSR-303 Bean Validation API現(xiàn)在是完全支持的。Spring的DataBinder現(xiàn)在可以校驗數(shù)據(jù)的同時綁定它們。Spring MVC支持聲明式校驗@Controller輸入。

2.1 JSR-303 Bean Validation API概覽

JSR-303是為Java平臺制定的約束聲明和元數(shù)據(jù)標準化規(guī)范。你可以在域模型(實體類)的屬性上使用注解式聲明校驗約束條件。你也可以定義自己的約束條件。

為了方便解釋,我看來看一個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校驗器校驗時,這些約束條件將會被強制執(zhí)行。

關(guān)于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注入到應(yīng)用程序需要被驗證的地方。

使用LocalValidatorFactoryBean來配置一個默認的校驗器作為一個Spring bean:

<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

LocalValidatorFactoryBean同時實現(xiàn)了javax.validation.ValidatorFactory、javax.validation.Validatororg.springframework.validation.Validator。你可以注入它們其中任何一個引用到需要執(zhí)行校驗邏輯的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 觸發(fā)@Controller輸入校驗

為了觸發(fā)校驗,只需簡單的在輸入?yún)?shù)前添加@Valid注解:

@Controller
public class MyController {

    @RequestMapping("/foo", method=RequestMethod.POST)
    public void processFoo(@Valid Foo foo) { /* ... */ }

Spring MVC在數(shù)據(jù)綁定結(jié)束后會使用一個合適的校驗器來進行校驗。

注意:@Valid注解是JSR-303 Bean Validation API的一部分,并不是Spring特有的結(jié)構(gòu)。

你可以配置一個自定義的校驗器或者使用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>

怎么實現(xiàn)自己的校驗器可以看這里。

第二種方式是使用JSR-303/JSR-349的校驗器,例如:Hibernate Validator。將他添加到你的classpath,Spring MVC會自動發(fā)現(xiàn)。

<?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()來獲取字段的錯誤。

后續(xù)會補充下JSR-303的一些注解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容