淺談spring方法級參數(shù)校驗(@Validated)
依賴的jar包:
spring相關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吧
<!--注冊方法驗證的處理器--> <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
二、需要在驗證的類上(最好在接口上)添加注解 @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 {
/**
* 唯一鍵,項目唯一標識(一般是項目名稱)
*/
@NotBlank(message = "重要參數(shù)不能為空")
private String sessionId;
/**
* 項目的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 {
/**
* 設置一個字符串類型的值,如果記錄存在則覆蓋原有value
*
* @param key 值對應的鍵
* @param value 值
* @return 狀態(tài)碼, 成功則返回OK
*/
String set(@NotBlank(message = "key值不能為空") String key, String value, @Min(1) int expireSeconds);
三、捕獲 ConstraintViolationException 異常,進行后續(xù)提示等處理
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 處理接口數(shù)據(jù)驗證異常
*/
@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ù)驗證異常
*/
@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);
}
// 對返回數(shù)據(jù)進行截取和編碼處理,防止中文亂碼和返回數(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報錯:", e);
}
rtnMessage = "{\"message\":\"" + rtnMessage + "\",\"status\":\"error\"}";
return rtnMessage;
}
}
}
四、支持的注解如下:
spring支持jsr303以及hibernate中的校驗規(guī)則
@AssertFalse 對應參數(shù)為false
@AssertTrue 對應參數(shù)為true
@DecimalMax("1") 對應小數(shù)的最大值
@DecimalMin("1") 對應小數(shù)的最小值
@Digits(integer=1,fraction = 2) 對應數(shù)字整數(shù)(integer)和小數(shù)(fraction)位數(shù)
@Future Date只接受將來的時間
@Past Date只接受過去的時間
@Max(100) 數(shù)字最大值
@Min(100) 數(shù)字最小值
@NotNull 不接受Null值
@Null 只接受Null值
@Pattern(regexp="^a$") 正則表達式regexp為表達式
@Size(min=1,max=2) 參數(shù)的長度min/max為最小/最大長度
hibernate validation
@CreditCardNumber Luhn算法校驗,用于防止用戶錯誤輸入,并不真實校驗信用卡號
@EAN 歐洲商品標碼校驗
@Email 郵箱校驗
@Length 校驗string的長度
@LuhnCheck Luhn算法校驗
@NotBlank 字符串非null非空
@NotEmpty 字符串、集合、map非空
@ParameterScriptAssert 使用腳本進行校驗支持JSR223腳本
@Range 匹配數(shù)字或表示數(shù)字的字符串的取值范圍
@SafeHtml 校驗是否包含惡意腳本
@URL 合法URL
@Validated校驗的坑
![]()
BindingResult必須緊挨著放在實體的后面,否則跳轉后

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java讀取配置文件(properties)的時候,unicode碼轉utf-8方式
這篇文章主要介紹了java讀取配置文件(properties)的時候,unicode碼轉utf-8方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
解決java.util.NoSuchElementException異常正確方法
java.util.NoSuchElementException是Java中的一種異常,表示在迭代器或枚舉中找不到元素,這篇文章主要給大家介紹了關于解決java.util.NoSuchElementException異常的相關資料,需要的朋友可以參考下2023-11-11
SpringBoot 自定義+動態(tài)切換數(shù)據(jù)源教程
這篇文章主要介紹了SpringBoot 自定義+動態(tài)切換數(shù)據(jù)源教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
kafka運維consumer-groups.sh消費者組管理
這篇文章主要為大家介紹了kafka運維consumer-groups.sh消費者組管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
Mybatis-Plus實體類注解方法與mapper層和service層的CRUD方法
CRUD是指在做計算處理時的增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。主要被用在描述軟件系統(tǒng)中DataBase或者持久層的基本操作功能,下面讓我們一起看看吧2022-03-03

