淺談spring方法級(jí)參數(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容器需要各配置一個(gè),呵呵,大家還是用springBoot吧
<!--注冊(cè)方法驗(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)識(shí)(一般是項(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è)置一個(gè)字符串類型的值,如果記錄存在則覆蓋原有value * * @param key 值對(duì)應(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); } // 對(duì)返回?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)錯(cuò):", e); } rtnMessage = "{\"message\":\"" + rtnMessage + "\",\"status\":\"error\"}"; return rtnMessage; } } }
四、支持的注解如下:
spring支持jsr303以及hibernate中的校驗(yàn)規(guī)則
@AssertFalse 對(duì)應(yīng)參數(shù)為false
@AssertTrue 對(duì)應(yīng)參數(shù)為true
@DecimalMax("1") 對(duì)應(yīng)小數(shù)的最大值
@DecimalMin("1") 對(duì)應(yīng)小數(shù)的最小值
@Digits(integer=1,fraction = 2) 對(duì)應(yīng)數(shù)字整數(shù)(integer)和小數(shù)(fraction)位數(shù)
@Future Date只接受將來的時(shí)間
@Past Date只接受過去的時(shí)間
@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),用于防止用戶錯(cuò)誤輸入,并不真實(shí)校驗(yàn)信用卡號(hào)
@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)后
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java讀取配置文件(properties)的時(shí)候,unicode碼轉(zhuǎn)utf-8方式
這篇文章主要介紹了java讀取配置文件(properties)的時(shí)候,unicode碼轉(zhuǎn)utf-8方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringCache緩存自定義配置的實(shí)現(xiàn)
本文主要介紹了SpringCache緩存自定義配置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01解決java.util.NoSuchElementException異常正確方法
java.util.NoSuchElementException是Java中的一種異常,表示在迭代器或枚舉中找不到元素,這篇文章主要給大家介紹了關(guān)于解決java.util.NoSuchElementException異常的相關(guān)資料,需要的朋友可以參考下2023-11-11SpringBoot 自定義+動(dòng)態(tài)切換數(shù)據(jù)源教程
這篇文章主要介紹了SpringBoot 自定義+動(dòng)態(tài)切換數(shù)據(jù)源教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理
這篇文章主要為大家介紹了kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11springboot帶有進(jìn)度條的上傳功能完整實(shí)例
這篇文章主要介紹了springboot帶有進(jìn)度條的上傳功能,結(jié)合完整實(shí)例形式分析了springboot帶進(jìn)度條上傳的原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-11-11Spring框架學(xué)習(xí)筆記之方法注解@Bean的使用
這篇文章主要給大家介紹了關(guān)于Spring框架學(xué)習(xí)筆記之方法注解@Bean使用的相關(guān)資料,這是一個(gè)我們很常用的注解,作用是指示一個(gè)方法生成一個(gè)由Spring管理的Bean,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Mybatis-Plus實(shí)體類注解方法與mapper層和service層的CRUD方法
CRUD是指在做計(jì)算處理時(shí)的增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡寫。主要被用在描述軟件系統(tǒng)中DataBase或者持久層的基本操作功能,下面讓我們一起看看吧2022-03-03