淺談spring方法級參數(shù)校驗(yàn)(@Validated)
依賴的jar包:
spring相關(guān)jar包版本:4.3.1.RELEASE
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
一、配置與注入 MethodValidationPostProcessor
注意:spring容器與springMVC容器需要各配置一個,呵呵,大家還是用springBoot吧
<!--注冊方法驗(yàn)證的處理器--> <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
二、需要在驗(yàn)證的類上(最好在接口上)添加注解 @Validated
例子:
@RequestMapping("/add")
public void add(@Validated CoverageAddDTO coverageAddDTO, HttpServletResponse response) {
String validateTip = validateParams(coverageAddDTO);
if (StringUtils.isNotBlank(validateTip)) {
ajaxJsonErrorMessage(response, validateTip);
return;
}
BaseBO dealResult = coverService.addProjectInfo(coverageAddDTO);
if (dealResult.getHandleSuccess()) {
ajaxJsonSuccessMessage(response, "新增成功");
} else {
ajaxJsonErrorMessage(response, dealResult.getMessage());
}
}
class CoverageAddDTO {
/**
* 唯一鍵,項(xiàng)目唯一標(biāo)識(一般是項(xiàng)目名稱)
*/
@NotBlank(message = "重要參數(shù)不能為空")
private String sessionId;
/**
* 項(xiàng)目的Git地址
*/
@NotBlank(message = "重要參數(shù)不能為空")
@Pattern(regexp = "^git@.*\\.git$", message = "Git地址不符合規(guī)范(git@....git)")
private String gitUrl;
/**
* Git上分支名稱
*/
@NotBlank(message = "重要參數(shù)不能為空")
private String branchName;
或者
/**
* @description: jedis操作redis集群-接口方法類
* @author: wangpeng
**/
@Validated
public interface JedisClient {
/**
* 設(shè)置一個字符串類型的值,如果記錄存在則覆蓋原有value
*
* @param key 值對應(yīng)的鍵
* @param value 值
* @return 狀態(tài)碼, 成功則返回OK
*/
String set(@NotBlank(message = "key值不能為空") String key, String value, @Min(1) int expireSeconds);
三、捕獲 ConstraintViolationException 異常,進(jìn)行后續(xù)提示等處理
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 處理接口數(shù)據(jù)驗(yàn)證異常
*/
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public String handleMethodArgumentNotValidException(ConstraintViolationException ex) {
logger.error("ConstraintViolationException:{}", ex.getMessage());
Iterator<ConstraintViolation<?>>
iterator = ex.getConstraintViolations().iterator();
String message = null;
if (iterator.hasNext()) {
message = iterator.next().getMessage();
}
return encode(message);
}
/**
* 處理接口數(shù)據(jù)驗(yàn)證異常
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public String handleMethodArgumentNotValidException(BindException ex) {
logger.error("BindException:{}", ex.getMessage());
String message = ex.getFieldErrors().get(0).getDefaultMessage();
return encode(message);
}
@ExceptionHandler(Exception.class) // 捕獲所有逃逸的異常
@ResponseBody
public String handleAllUnCatchException(Exception ex) {
logger.error("未知異常:", ex);
String message = ex.getMessage();
return encode(message);
}
// 對返回?cái)?shù)據(jù)進(jìn)行截取和編碼處理,防止中文亂碼和返回?cái)?shù)據(jù)量過大
private String encode(String errorMsg) {
String rtnMessage = errorMsg;
if (StringUtils.isBlank(errorMsg)) {
rtnMessage = "{\"message\":\"error\",\"status\":\"error\"}";
return rtnMessage;
} else {
if (errorMsg.length() > 100) {
rtnMessage = errorMsg.substring(0, 100);
}
// 特殊字符編碼,解決中文亂碼問題
try {
rtnMessage = URLEncoder.encode(rtnMessage, "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("URLEncoder報(bào)錯:", e);
}
rtnMessage = "{\"message\":\"" + rtnMessage + "\",\"status\":\"error\"}";
return rtnMessage;
}
}
}
四、支持的注解如下:
spring支持jsr303以及hibernate中的校驗(yàn)規(guī)則
@AssertFalse 對應(yīng)參數(shù)為false
@AssertTrue 對應(yīng)參數(shù)為true
@DecimalMax("1") 對應(yīng)小數(shù)的最大值
@DecimalMin("1") 對應(yīng)小數(shù)的最小值
@Digits(integer=1,fraction = 2) 對應(yīng)數(shù)字整數(shù)(integer)和小數(shù)(fraction)位數(shù)
@Future Date只接受將來的時間
@Past Date只接受過去的時間
@Max(100) 數(shù)字最大值
@Min(100) 數(shù)字最小值
@NotNull 不接受Null值
@Null 只接受Null值
@Pattern(regexp="^a$") 正則表達(dá)式regexp為表達(dá)式
@Size(min=1,max=2) 參數(shù)的長度min/max為最小/最大長度
hibernate validation
@CreditCardNumber Luhn算法校驗(yàn),用于防止用戶錯誤輸入,并不真實(shí)校驗(yàn)信用卡號
@EAN 歐洲商品標(biāo)碼校驗(yàn)
@Email 郵箱校驗(yàn)
@Length 校驗(yàn)string的長度
@LuhnCheck Luhn算法校驗(yàn)
@NotBlank 字符串非null非空
@NotEmpty 字符串、集合、map非空
@ParameterScriptAssert 使用腳本進(jìn)行校驗(yàn)支持JSR223腳本
@Range 匹配數(shù)字或表示數(shù)字的字符串的取值范圍
@SafeHtml 校驗(yàn)是否包含惡意腳本
@URL 合法URL
@Validated校驗(yàn)的坑
![]()
BindingResult必須緊挨著放在實(shí)體的后面,否則跳轉(zhuǎn)后

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 實(shí)現(xiàn)FTP服務(wù)實(shí)例詳解
這篇文章主要介紹了Java 實(shí)現(xiàn)FTP服務(wù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Java解決計(jì)算相鄰兩個數(shù)的最大差值的問題
今天給大家?guī)硪坏浪惴}:給定一個數(shù)組,求如果排序之后,相鄰兩數(shù)的最大差值。要求時間復(fù)雜度O(N),且要求不能用非基于比較的排序??靵砀S小編一起學(xué)習(xí)一下如何解決這一問題吧2021-12-12
Java關(guān)鍵字詳解之final static this super的用法
this用來調(diào)用目前類自身的成員變量,super多用來調(diào)用父類的成員,final多用來定義常量用的,static定義靜態(tài)變量方法用的,靜態(tài)變量方法只能被類本身調(diào)用,下文將詳細(xì)介紹,需要的朋友可以參考下2021-10-10
Springboot配置管理Externalized?Configuration深入探究
這篇文章主要介紹了Springboot配置管Externalized?Configuration深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Java 并發(fā)編程:volatile的使用及其原理解析
下面小編就為大家?guī)硪黄狫ava 并發(fā)編程:volatile的使用及其原理解析。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
詳解Java的Hibernate框架中的List映射表與Bag映射
這篇文章主要介紹了Java的Hibernate框架中的List映射表與Bag映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐
在系統(tǒng)業(yè)務(wù)中,需要想客戶發(fā)送手機(jī)驗(yàn)證碼,進(jìn)行驗(yàn)證后,才能提交,本文主要介紹了springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

