Spring MVC 驗證支持

2018-07-26 14:51 更新

Spring提供了一個驗證器Validator接口,應用的任何一層都可以使用它來做驗證。在Spring MVC中,你可以配置一個全局的Validator實例,用以處理所有注解了@Valid的元素或注解了@Validated的控制器方法參數(shù)、以及/或在控制器內的@InitBinder方法中用作局部的Validator。全局驗證器與局部驗證器實例可以結合起來使用,提供組合驗證。

Spring還支持JSR-303/JSR-349的Bean驗證。這是通過LocalValidatorFactoryBean類實現(xiàn)的,它為Spring的驗證器接口org.springframework.validation.Validator到Bean驗證的javax.validation.Validator接口做了適配。這個類可以插入到Spring MVC的上下文中,作為一個全局的驗證器,如下所述。

如果在classpath下存在Bean驗證器,諸如Hibernate Validator等,那么@EnableWebMvc<mvc:annotation-driven>默認會自動使用LocalValidatorFactoryBean為Spring MVC應用提供Bean驗證的支持。

有時,能將LocalValidatorFactoryBean直接注入到控制器或另外一個類中會更方便。

Sometimes it's convenient to have a LocalValidatorFactoryBean injected into a controller or another class. The easiest way to do that is to declare your own @Bean and also mark it with @Primary in order to avoid a conflict with the one provided with the MVC Java config.

If you prefer to use the one from the MVC Java config, you'll need to override the mvcValidatormethod from WebMvcConfigurationSupport and declare the method to explicitly return LocalValidatorFactory rather than Validator. See Section 21.16.13, "Advanced Customizations with MVC Java Config" for information on how to switch to extend the provided configuration.

此外,你也可以配置你自己的全局Validator驗證器實例:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public Validator getValidator(); {
        // return "global" validator
    }

}

XML中做法如下:

<?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>

若要同時使用全局驗證和局部驗證,只需添加一個(或多個)局部驗證器即可:

@Controller
public class MyController {

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(new FooValidator());
    }

}

做完這個最少的配置之后,任何時候只要方法中有參數(shù)注解了@Valid@Validated,配置的驗證器就會自動對它們做驗證。任何無法通過的驗證都會被自動報告為錯誤并添加到BindingResult對象中去,你可以在方法參數(shù)中聲明它并獲取這些錯誤,同時這些錯誤也能在Spring MVC的HTML視圖中被渲染。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號