欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring 中@Validated 分組校驗(yàn)的使用解析

 更新時(shí)間:2021年10月20日 09:32:58   作者:妖四靈.Shuen  
這篇文章主要介紹了Spring 中@Validated 分組校驗(yàn)的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring @Validated分組校驗(yàn)的使用

通過(guò)本文你能學(xué)習(xí)到@Validated 的基本使用,以及如何再spring-boot 中進(jìn)行數(shù)據(jù)異常的統(tǒng)一處理

Spring Validation驗(yàn)證框架對(duì)參數(shù)的驗(yàn)證機(jī)制提供了@Validated(Spring's JSR-303規(guī)范,是標(biāo)準(zhǔn)JSR-303的一個(gè)變種),javax提供了@Valid(標(biāo)準(zhǔn)JSR-303規(guī)范),配合BindingResult可以直接提供參數(shù)驗(yàn)證結(jié)果。

在檢驗(yàn)入?yún)⑹欠穹弦?guī)范時(shí),使用@Validated或者@Valid在基本驗(yàn)證功能上沒(méi)有太多區(qū)別。但是在分組、注解地方、嵌套驗(yàn)證等功能上兩個(gè)有所不同,總體來(lái)說(shuō)@validated 相當(dāng)于 @Valid 驗(yàn)證的升級(jí)版,功能更加強(qiáng)大。

接下來(lái)我們直接看下如何使用

引入POM依賴

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>

定義公共分組class(用于標(biāo)記分組,可以像后面定義在Vo里面,但是建議一些常用的定義在外部),如下

public interface Add {
}
public interface Edit {
}

定義接收數(shù)據(jù)的Vo

注意注解中分組的的使用,為了演示,同時(shí)在內(nèi)部定義了一個(gè)特殊分組類(lèi)

 
import com.example.jsr.commmon.Add;
import com.example.jsr.commmon.Edit;
import org.hibernate.validator.constraints.NotBlank; 
import javax.validation.constraints.Pattern; 
public class ParamsVo {
 
    //特殊用于修改年齡 標(biāo)記使用 靈活放置位置
    public interface ModifyAge {
    }
 
    //年齡是1-120之間有效
    public static final String AGE_REG = "/^(?:[1-9][0-9]?|1[01][0-9]|120)$/";
 
    @NotBlank(
            groups = {Edit.class, ParamsVo.ModifyAge.class},
            message = "失敗,id不能為空"
    )
    private String id;
 
    @NotBlank(groups = {Edit.class, Add.class}, message = "失敗,名字不能為空")
    private String name;
 
    //自定義一個(gè)正則
    @NotBlank(groups = {Add.class, ParamsVo.ModifyAge.class},
            message = "失敗,請(qǐng)?zhí)顚?xiě)age"
    )
    @Pattern(regexp = AGE_REG,groups = {Add.class, ParamsVo.ModifyAge.class},
            message = "失敗,請(qǐng)?zhí)顚?xiě)正確age"
    )
    private String age; 
    ...省略setter getter 方法....
}

統(tǒng)一異常處理類(lèi)

 
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
 
/**
 * 全局異常處理
 */
@ControllerAdvice
public class GlobalExceptionHandler {
 
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public String handlerUnexpectedTypeException(BindException ex){
        BindingResult result = ex.getBindingResult();
        if (result.hasErrors()) {
            FieldError fieldError = result.getFieldError();
            if (fieldError != null) {
                return fieldError.getDefaultMessage();
            }
        }
        return "失敗,請(qǐng)刷新重試";
    } 
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handlerException(Exception ex){
        ex.printStackTrace();
        return "失敗,請(qǐng)刷新重試";
    }
}

測(cè)試類(lèi)

import com.example.jsr.Vo.ParamsVo;
import com.example.jsr.commmon.Add;
import com.example.jsr.commmon.Edit;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Controller
@RequestMapping("/validated/test")
public class ValidatedTestController {
 
    @RequestMapping("/add")
    @ResponseBody
    public String add(
            @Validated(Add.class)ParamsVo paramsVo){
        System.out.println(String.format("add obj = {%s}",paramsVo.toString()));
        return "success";
    } 
    @RequestMapping("/edit")
    @ResponseBody
    public String editAll(
            @Validated({Edit.class,ParamsVo.ModifyAge.class})ParamsVo paramsVo){
        System.out.println(String.format("edit obj = {%s}",paramsVo.toString()));
        return "success"; 
    }
}

頁(yè)面效果測(cè)試

不填age

填入一個(gè)錯(cuò)誤age

到此為止,基本的使用相信也是沒(méi)有問(wèn)題了

使用@Validated分組遇到的坑

在使用@Validate注解分組校驗(yàn)時(shí),如果指定分組,所有的需要驗(yàn)證的屬性都必須添加指定分組才會(huì)校驗(yàn)

解決辦法

沒(méi)有指明分組的屬性都屬于Default,所以分組接口繼承Default就可以解決

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA多線程之方法 JOIN詳解及實(shí)例代碼

    JAVA多線程之方法 JOIN詳解及實(shí)例代碼

    這篇文章主要介紹了JAVA多線程之方法 JOIN詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解Java的閉包

    詳解Java的閉包

    這篇文章主要介紹了詳解Java的閉包,作者從Lambda和默認(rèn)方法等重要特性深入講解,極力推薦!需要的朋友可以參考下
    2015-07-07
  • 深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib

    深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib

    這篇文章主要介紹了深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib,一般我們編寫(xiě)程序的思想是縱向的,也就是一個(gè)方法代碼從該方法第一行開(kāi)始往下一步一步走,直到走完最后一行代碼,也就是說(shuō)很多業(yè)務(wù)都需要的比如用戶鑒權(quán),資源釋放等,需要的朋友可以參考下
    2023-12-12
  • Springboot基于maven打包分離lib及resource

    Springboot基于maven打包分離lib及resource

    這篇文章主要介紹了Springboot基于maven打包分離lib及resource,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java?深入淺出解析面向?qū)ο笾橄箢?lèi)和接口

    Java?深入淺出解析面向?qū)ο笾橄箢?lèi)和接口

    本章具體介紹了抽象類(lèi)和接口,整篇文章用目前流行的手機(jī)來(lái)舉例,圖解穿插代碼案例。?JAVA成仙路從基礎(chǔ)開(kāi)始講,后續(xù)會(huì)講到JAVA高級(jí),中間會(huì)穿插面試題和項(xiàng)目實(shí)戰(zhàn),希望能給大家?guī)?lái)幫助
    2022-03-03
  • java中的FileReader和FileWriter讀寫(xiě)流

    java中的FileReader和FileWriter讀寫(xiě)流

    這篇文章主要介紹了java中的FileReader和FileWriter讀寫(xiě)流,在java中對(duì)數(shù)據(jù)輸入輸出的操作陳作為流我們對(duì)不同的文件進(jìn)行操作,或者對(duì)操作文件進(jìn)行輸入和輸出時(shí)所用的流都是不同的,因此在java.io的包下存在很多流的類(lèi)或者接口提供給我們對(duì)應(yīng)的操作,需要的朋友可以參考下
    2023-10-10
  • 使用@Service注解出現(xiàn)No bean named 'xxxx' available]錯(cuò)誤的解決

    使用@Service注解出現(xiàn)No bean named 'xxxx'&

    這篇文章主要介紹了使用@Service注解出現(xiàn)No bean named 'xxxx' available]錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java基礎(chǔ)之教你如何正確運(yùn)用依賴注入

    Java基礎(chǔ)之教你如何正確運(yùn)用依賴注入

    最近發(fā)現(xiàn)很多使用Spring框架的Java代碼存在依賴注入方式的誤用,甚至是濫用.因此整理了這篇文章,歡迎大家一起探討,需要的朋友可以參考下
    2021-05-05
  • Java定義畫(huà)板類(lèi)的方法

    Java定義畫(huà)板類(lèi)的方法

    這篇文章主要為大家詳細(xì)介紹了Java定義畫(huà)板類(lèi)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱

    詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱

    這篇文章主要介紹了詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論