1 導(dǎo)入必要依賴(默認(rèn)已經(jīng)導(dǎo)入springmvc的相關(guān)依賴)
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<!--hibernate校驗器饶深,與hibernate的數(shù)據(jù)獲取無關(guān)-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.4.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2 配置校驗器bean于錯誤提示文件
配置bean
<!-- 校驗器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校驗器類 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校驗使用的資源文件,如果不指定則默認(rèn)使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校驗錯誤信息配置文件,使用ReloadableResourceBundleMessageSource加載配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:ValidationMessages</value>
</list>
</property>
<!-- 資源文件編碼格式 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 對資源文件內(nèi)容緩存時間,單位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
在錯誤文件ValidationMessages.properties文件中編寫錯誤提示信息
user.name.length=用戶名長度必須在6到9之間
user.name.notNull=用戶名不能為空
在需要校驗的實體類中使用注解指定校驗方式于提示信息
package com.dahuici.zyb.entity;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
public class User {
//非空校驗
@NotNull(message = "{user.name.notNull}")
//字符串長度校驗
@Size(min = 6,max = 9,message = "{user.name.length}")
private String name;
private Integer age;
public User(){
}
public User(String name,Integer age){
this.name = name;
this.age = age;
}
}
3 將校驗器注入適配器
這里的適配器是RequestMappingHandlerAdapter裹纳,查看源碼會發(fā)現(xiàn)該類沒有校驗器對應(yīng)的屬性,其實該校驗器是注入進(jìn)了適配器的WebBindingInitializer屬性的validator屬性里面睬辐。所以還有一種租入適配器的方式是通過WebBindingInitializer屬性注入栖茉,具體注入的WebBindingInitializer實際是其實現(xiàn)類ConfigurableWebBindingInitializer的實例對象。
<!--自己配置映射器與適配器并注入校驗器-->
<mvc:annotation-driven validator="validator">
<!--配置返回值轉(zhuǎn)換器-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="utf-8"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
4 驗證
在controller里面用@Validated表示該實體需要驗證纹份,然后用BindingResult對象接受驗證結(jié)果,當(dāng)驗證不通過時BindingResult就會接受對應(yīng)的錯誤提示信息廷痘。
@GetMapping("/test.do")
public String helloword(@Validated User user,BindingResult bindingResult)
throws IOException
{
StringBuffer stringBuffer = new StringBuffer();
if (bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
allErrors.forEach(e -> stringBuffer.append(e.getDefaultMessage()));
return stringBuffer.toString();
}
return "驗證成功";
}
@Validated與@Valid區(qū)別
1 @Validated可以分組驗證蔓涧,@Valid不能
對于實體,同一個屬性對于不同的操作有不同的驗證規(guī)則(例如插入與更新)笋额,這時就需要對屬性的驗證進(jìn)行分組元暴。
實體:
@NotNull(message = "id不能為空",groups = {Update.class})
private String id;
controller:
@PutMapping("/idtuConstructionProcess")
public ResponseEntity update(@RequestBody @Validated({Update.class}) IdtuConstructionProcess idtuConstructionProcess) {
boolean result = idtuConstructionProcessService.updateById(idtuConstructionProcess);
return new ResponseEntity(result ? ResponseEntity.SUCCESS : ResponseEntity.SERVER_ERROR, result ? "success" : "failed");
}
2 注解地方
@Validated:可以用在類、方法和方法參數(shù)上兄猩。但是不能用在成員屬性(字段)上
@Valid:可以用在方法茉盏、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(字段)上
由于@Valid可以使用在屬性上枢冤,因此@Validated可以結(jié)合@Valid實現(xiàn)嵌套驗證
3 嵌套驗證
當(dāng)一個實體的屬性是另一個實體鸠姨,例如用戶實體(User)擁有一輛車(Car),希望在驗證User時也對Car屬性進(jìn)行驗證,那么就必須在Car屬性前添加@Valid掏导。添加了@Valid后就能進(jìn)行嵌套驗證享怀。
提示:如果只在controller層使用@Validated注解時,可以直接在參數(shù)前面添加趟咆,類上無需添加@Validated注解添瓷,但是如果要在Controller層使用@NotNull這些注解,那么Controller類上必須添加@Validated注解才能生效值纱。(在springboot上測試的鳞贷,沒有單獨使用springmvc測試該功能)
常用注解
可參考這篇博客:
https://blog.csdn.net/qq_37805065/article/details/102638136