Spring-Validation 后端數據校驗的實現_java

來源:腳本之家  責任編輯:小易  

Spring數據校驗2113spring擁有自己獨立的數據校驗框架,同時支持5261JSR303標注校驗。springDataBinder在進4102行數據綁定時,可同時調用校1653驗框架完成數據校驗工作。在spring mvc中則可直接通過注解驅動的方式進行數據校驗Validator校驗接口boolean supports(Class<?> clazz):該校驗器能夠對clazz類型的對象進行校驗void validate(Object target,Errors errors):對目標對象進行校驗,并將校驗錯誤記錄到errorsLocalValidatorFactoryBeanLocalValidatorFactoryBean既實現了spring的validator接口,也實現了JSR303的Validator接口。只要在spring 容器中定義一個LocalValidatorFactoryBean,即可將其注入到需要校驗的Bean中。<bean id="validator"class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>Spring mvc數據校驗<mvc:annotation-driven>會默認裝配好一個LocalValidatorFactoryBean,通過在處理方法的入參上標注@Valid注解即可讓spring mvc執行數據校驗工作。public String handle91(@Valid @ModelAttribute(“user”)Useruser,BindingResult bindingResult){if(bingingResult.hasErrors){return“/user/register”;}return “/user/showUser”}將入參對象添加@Valid注解,同時緊跟其后聲明一個BindingResult的入參,根據BingingResult即可判斷是否存在錯誤。綁定接口既可以是BindingResult也可以Errors類型在頁面顯示錯誤spring mvc除了會將表單/命令對象的校驗結果保存在對應的BindingResult或Errors中,還會將所有校驗結果保存到隱含模型中,也就是說即使處理方法的簽名沒有對應于表單/命令對象的校驗結果入參,校驗結果也不會丟失,它們始終可以在隱含模型中獲取。隱含模型中所有數據最終通過HttpServletRequest的屬性列表暴露給JSP視圖對象。通過國際化資源顯示錯誤信息每個屬性在數據綁定和數據校驗發生錯誤時,都會產生一個對應的FieldError對象,FieldError實現了org.springframework.context.MessageSourceResolvable接口。MessageSourceResolvable是可用國際化資源進行解析對象。MessageSourceResolvable提供3個接口Object getArguments():返回一組參數對象String[] getCodes():返回一組消息代碼,每個代碼對應一個資源屬性,可以使用getArguments()返回的參數對資源屬性進行參數替換String getDefaultMessage():默認消息當一個屬性校驗失敗后,校驗框架會為該屬性生成4個消息代碼,這些代碼以校驗注解類名為前綴,結合類名、屬性名、屬性類型名生成多個消息代碼如User類的password屬性標注了一個@Pattern的注解,當校驗失敗后會產生如下4個錯誤代碼Parttern.user.passwordParttern.passwordParttern.java.lang.StringParttern當使用Sprng mvc標簽顯示錯誤信息時,Spring mvc查看web上下文是否裝配了對應國際化消息,如果沒有,則顯示默認的錯誤消息,否則使用國際化消息對錯誤代碼進行翻譯。如果在數據類型轉換或數據類型格式時發生錯誤,或者該有的參數不存在,或者調用處理方法時發生錯誤,都會在隱含模型中創建錯誤消息,其錯誤代碼前綴說明如下:required:必要的參數不存在,如@RequestParam(“param1”)標注了一個入參,當請求參數不存在時typeMismatch:在數據綁定時發生數據類型不匹配methodInvocation:spring mvc在調用方法時發生錯誤示例如果”aaa”非數字參數傳遞給User的salary屬性,將發生數據轉換的錯誤,Spring將為該錯誤生成如下錯誤代碼typeMismatch.user.salarytypeMismatch.salarytypeMismatch.longtypMismatch裝配國際化資源<bean id="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"><propertyname="basename"><value>conf/i18n/messages</value></property></bean>也可以通過basenames屬性指定多個國際化資源在conf/i18n下添加基名為messages的國際化資源,一個默認的messages.properties,另一個對應messages_zh_CN.properties自定義校驗規則通過@InitBinder注解的initBinder方法中裝配自定[email protected] void initBinder(WebDataBinder binder){binder.setValidtor(newXXX());//在進行數據綁定時使用的校驗器}也可以借助請求處理方法的簽名傳遞一個Errors或BindingResult對象進來,然后在處理方法中直接校驗。public String handle92(@ModelAttribute(“user”Useruser,BindingResult bindingResult)){ValidationUtils.rejectIfEmptyOrWritespace(bindingResult,”username”,”required”);//產生的錯誤信息對象錯誤代碼包括//required.user.username// required.username// required.java.lang.String// requiredif(“aaa”.equalsIgnoreCase(user.getUsername())){bindingResult.rejectValue(“username”,”reserved”);//產生的錯誤代碼如下//reserved.user.username// reserved.username// reserved.java.lang.String// reserved}if(bindingResult.hasErrors()){return “/user/register4”;}else{return “/user/showUser”;}}binder.setValidator()方法設置自定義的Validtor后,spring mvc將使用它對入參進行校驗,將不在使用spring mvc框架裝配的Validator對入參對象進行校驗,即使入參標注了@Valid注解也不會校驗本回答被提問者采納www.anxorj.tw防采集請勿采集本網。

前言

最近看到很多童鞋在項目中的對請求參數的校驗都用的if來判斷各參數的屬性,如:

Struts的優點 1、表現層標簽是個好東西。jstl和struts的配合最好。2、控制層的取form和validate很直觀。servlet和struts的配合也不錯。webwork的優點 1、interceptor是最大的優勢,這個東東不

if(StringUtils.isBlank(username)){ return RR.exception("賬號不能為空");}if(StringUtils.isBlank(password)){ return RR.exception("密碼不能為空");}if(StringUtils.isBlank(realName)){ return RR.exception("姓名不能為空");}......

配置錯了-!

每個參數都需要這樣一個個去校驗null,返回對應信息,代碼就像疊羅漢一樣~~,在此,樓主強烈推薦一個神器:Validation,有了它,再也不用這樣去校驗參數啦,可以讓我們在項目中不用太關注其他東西,專注于業務邏輯的編寫。

如果想采用成熟的解決方案,可以結合Spring scurity,很強大,很完善。如果想自己寫,那和普通的WEB程序控制沒什么兩樣,使用過濾器,或者繼承帶有權限判斷的類

引入核心依賴

提供一個大致的思路 hibernate取到數據后放在list里面,action中return根據你的配置轉到頁面 頁面用table顯示表格就可以了,用iterator迭代顯示你的信息 . . .

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>

(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象,就表示表單驗證成功;(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果

使用示例-添加用戶

需要校驗的實體類,在此使用了一些常用的校驗注解,基本上能夠見名知意,每個注解中都有message屬性,就是校驗不通過后的提示信息

@[email protected]@[email protected](value = "Account", description = "用戶實體類")public class Account implements Serializable { private static final long serialVersionUID = -6310331730721778951L; private Long id; @NotBlank(message = "用戶名不能為空") @Length(max = 10, message = "用戶名最長為10位") private String name; @Pattern(regexp = PatternUtil.PASSWORDREGEX, message = "密碼為6-20位數字加字母組合") private String pwd; @NotBlank(message = "姓名不能為空") @Length(max = 8, message = "姓名最長為8位") private String realName; @Pattern(regexp = PatternUtil.PHONENOREGEX, message = "手機號碼格式不正確") private String phone; @NotNull(message = "用戶性別不能為空") @Max(value = 1,message = "性別 0:男 1:女") @Min(value = 0,message = "性別 0:男 1:女") private Integer sex; @NotNull(message = "用戶狀態不能為空") @Max(value = 1,message = "用戶狀態 0:啟用 1:禁用") @Min(value = 0,message = "用戶狀態 0:啟用 1:禁用") private Integer status; @Length(max = 200, message = "備注最長為200個字符") private String rmk;}

controller接口,注意在接收參數前需加上@Validated注解,這樣就會逐個去校驗實體類中需要加了校驗注解的的屬性,完全通過才進入下一步業務處理,否則拋出MethodArgumentNotValidException異常,在這里我們直接將異常拋出,交給全局異常處理類來處理。

@SysLog(menu = "用戶管理", function = "添加",filterParams = {"pwd","password","salt"})@PermissionCheck("account:manager:add")@PostMapping(value = "/add", produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = "用戶管理-添加用戶接口", notes = "用戶管理-添加用戶接口", httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR add(@Validated @RequestBody Account account) throws Exception { return RR.success("添加用戶成功");}

聲明全局異常處理類,處理所有異常,可以隨業務需要將異常種類細分,返回錯誤碼,返回提示信息可自由定義...   這里只需關注MethodArgumentNotValidException異常。

@RestControllerAdvicepublic class GlobalExceptionHandle { /** * @param e * @return * @Description 未知異常處理 */ @ExceptionHandler(Exception.class) public RR handleException(Exception e) { e.printStackTrace(); return RR.exception("系統異常,請聯系管理員"); } /** * @param e * @return * @Description 請求參數異常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public RR handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { return RR.exception("請求參數錯誤:[" + e.getBindingResult().getFieldError().getDefaultMessage() + "]"); } /** * @param e * @return * @Description 系統業務服務異常 */ @ExceptionHandler(ServerException.class) public RR handleServerException(ServerException e) { return RR.exception(e.getMessage()); } /** * @param e * @return * @Description 令牌校驗異常 */ @ExceptionHandler(ExpireException.class) public RR handleExpireException(ExpireException e) { return RR.expire(e.getMessage()); } /** * @param e * @return * @Description 無權訪問異常 */ @ExceptionHandler(AccessDeniedException.class) public RR handleAccessDeniedException(AccessDeniedException e) { return RR.forbidden(e.getMessage()); } /** * @param e * @return * @Description 自定義重復操作異常 */ public RR handleRepeatHandleException(RepeatHandleException e) { return RR.exception("您的請求已發送,請勿重復操作!"); } /** * @param e * @return * @Description 登錄異常處理 */ @ExceptionHandler(AuthenticationException.class) public RR handleAuthenticationException(AuthenticationException e) { return RR.exception(e.getMessage()); }}

然后我們用Swagger來測試一下接口

1.用戶名為空

2.手機號格式錯誤

通過返回結果可以看到,我們的校驗注解已經幫我們按照指定的校驗方式校驗了指定的字段屬性,我們在統一的全局異常處理類中將提示信息封裝成需要的返回結果就可以了。

分組校驗

有的童鞋在此可能有疑問了,上述方法雖然可行,但我在新增用戶和修改用戶兩個接口中,新增用戶的用戶id是自動生成的,無需校驗;修改用戶的用戶id是必傳的,則需校驗。在此業務場景中,那豈不是需要聲明兩個實體類,但這兩個實體類中的屬性又大致相同,這不是增加麻煩嗎?其實不然,在此我們可以用到 groups 屬性來解決此場景下的問題。

聲明分組

注意:在聲明分組的時候盡量加上 extend javax.validation.groups.Default 否則,在你聲明@Validated(Update.class)的時候,就會出現你在默認沒添加groups = {}的時候的校驗[email protected](message = "郵箱格式不對"),會不去校驗,因為默認的校驗組是groups = {Default.class}。

/** * 數據新增分組 */public interface Create extends Default {}/** * 數據更新分組 */public interface Update extends Default {}

校驗注解中添加分組,groups 為一個數組,可以添加多個分組

@NotNull(message = "id不能為空" , groups = Update.class)private Long id;@NotBlank(message = "用戶名不能為空" , groups = {Create.class, Update.class})@Length(max = 10, message = "用戶名最長為10位")private String name;

修改Controller中的@Validated注解,聲明校驗分組

@PermissionCheck("account:manager:add")@PostMapping(value = "/add", produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = "用戶管理-添加用戶接口", notes = "用戶管理-添加用戶接口", httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR add(@Validated(Create.class) @RequestBody Account account) throws Exception { return RR.success("添加用戶成功");}@PermissionCheck("account:manager:edit")@PostMapping(value = "/edit", produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = "用戶管理-修改用戶接口", notes = "用戶管理-修改用戶接口", httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR edit(@Validated(Update.class) @RequestBody Account account) throws Exception { return RR.success("編輯用戶成功");}

使用相同的請求參數測試一下添加用戶和修改用戶的接口

測試添加接口

測試修改接口

通過接口的返回結果可以看到,新增用戶的接口并沒有校驗id這個參數了,而修改用戶的接口中則校驗了id不能為空。

常用校驗注解

以上就是樓主在項目中使用validation的總結歸納,下面收集了一些常用注解,紅色的標注則是樓主在項目中用的比較多的。

JSR提供的校驗注解:

@Null 被注釋的元素必須為 null

@NotNull 被注釋的元素必須不為 null

@AssertTrue 被注釋的元素必須為 true

@AssertFalse 被注釋的元素必須為 false

@Min(value) 被注釋的元素必須是一個數字,其值必須大于等于指定的最小值

@Max(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值

@DecimalMin(value) 被注釋的元素必須是一個數字,其值必須大于等于指定的最小值

@DecimalMax(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值

@Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內

@Digits (integer, fraction) 被注釋的元素必須是一個數字,其值必須在可接受的范圍內

@Past 被注釋的元素必須是一個過去的日期

@Future 被注釋的元素必須是一個將來的日期

@Pattern(regex) 被注釋的元素必須符合指定的正則表達式

Hibernate Validator提供的校驗注解:

@NotBlank() 驗證字符串非null且非空格,長度必須大于0

@Email 被注釋的元素必須是電子郵箱地址

@Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內

@NotEmpty 被注釋的字符串的必須非空

@Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內

參考博文: http://www.anxorj.tw/article/157604.htm

到此這篇關于Spring-Validation 后端數據校驗的實現的文章就介紹到這了,更多相關Spring Validation數據校驗內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

你是不是正在用Spring Mvc做項目?你說的第一次加載的時候不顯示驗證是什么個情況?是一加載的時候就出現了錯誤驗證信息?還是說第一次加載的時候不讓它進行驗證?按道理說是不會在加載的時候就出現驗證信息。不知道你是否有遇到首頁面首次加載需要先執行后臺方法讀取數據再相應到頁面的問題,以及頁面跳轉之后F5刷新表單重復提交,或者是頁面跳轉或者重定向其他Action方法沒有反應等問題·內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • springmvc實現validation校驗過程詳解
  • spring boot validation參數校驗實例分析
  • springboot+dubbo+validation 進行rpc參數校驗的實現方法
  • spring自帶的校驗框架validation的使用實例
  • 詳解使用spring validation完成數據后端校驗
  • springboot使用校驗框架validation校驗的示例
  • 微信公眾平臺開發實戰java版之微信獲取用戶基本信息
  • java最全文件操作實例匯總
  • springboot集成jdbctemplate過程解析
  • java探索之hibernate主鍵生成策略詳細介紹
  • java如何調用shell腳本
  • java讀取xml文件的四種方法總結(必看篇)
  • gson ajax 數字精度丟失問題的解決方法
  • 詳解java繼承中屬性、方法和對象的關系
  • java讀取文件內容的三種方法代碼片斷分享(java文件操作)
  • spring boot springjpa 支持多個數據源的實例代碼
  • springMVC validate 的問題
  • 定遞歸驗證關聯的對象可以用于繼承對象嗎 spring validate
  • 請問spring與struts有什么區別?
  • springmvc validate時, 如何輸出帶參數的message
  • SpringMVC和Spring是什么關系
  • 關于Spring框架的一個問題
  • spring mvc如何做權限控制
  • 高手們 spring 求助!
  • 具體說說ssh框架中struts,hibernate和spring各自的功能是怎么實現的?
  • Spring aop 關于around環繞通知幾點疑惑,該如何處理怎么解決
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全c#教程vbvb.netc 語言java編程delphijavaandroidiosswiftscala易語言匯編語言其它相關首頁springmvc實現validation校驗過程詳解spring boot validation參數校驗實例分析springboot+dubbo+validation 進行rpc參數校驗的實現方法spring自帶的校驗框架validation的使用實例詳解使用spring validation完成數據后端校驗springboot使用校驗框架validation校驗的示例微信公眾平臺開發實戰java版之微信獲取用戶基本信息java最全文件操作實例匯總springboot集成jdbctemplate過程解析java探索之hibernate主鍵生成策略詳細介紹java如何調用shell腳本java讀取xml文件的四種方法總結(必看篇)gson ajax 數字精度丟失問題的解決方法詳解java繼承中屬性、方法和對象的關系java讀取文件內容的三種方法代碼片斷分享(java文件操作)spring boot springjpa 支持多個數據源的實例代碼java使double保留兩位小數的多方java8 十大新特性詳解java.net.socketexception: connjava寫入文件的幾種方法分享java環境變量的設置方法(圖文教程java 十六進制與字符串的轉換java list用法示例詳解java中file類的使用方法javaweb實現文件上傳下載功能實例java 字符串截取的三種方法(推薦spring mvc結果跳轉方法詳解spring5 webclient使用指南詳解android開發中實現用戶注冊和登陸的代碼實java不指定長度的二維數組實例java編程實現計算兩個日期的月份差實例代solr 配置中文分析器/定義業務域/配置datjava實現的微信圖片處理工具類【裁剪,合詳解servlet的url-pattern匹配規則淺談java中輸入輸出流實例詳解java面向接口編程之命令模式實例詳解
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.anxorj.tw All Rights Reserved
    陕西快乐10分下载