最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的validation參數(shù)校驗代碼實例

 更新時間:2023年10月08日 10:06:53   作者:言燼  
這篇文章主要介紹了Java的validation參數(shù)校驗代碼實例,Validation參數(shù)校驗是指在程序運行中對傳進來的參數(shù)進行合法性檢查,以保證程序的正確性和安全性,需要的朋友可以參考下

bean validation和hibernate validator參數(shù)校驗

常用注解

@Null(groups={Add.class}) 參數(shù)必須為null,group設置分組,默認為default
@NotNull 參數(shù)不為null
@NotEmpty 參數(shù)不為null ,"",集合不為空
@NotBlank 參數(shù)不為null, "", " ",只能作用字符串類型
@AssertFalse 被注釋的元素必須是false
@AssertTrue 被注釋的元素必須是true
@Min(value) 被注釋的元素必須為一個數(shù)字  >=
@Max(value) 被注釋的元素必須為一個數(shù)字 <= 
@DecimalMin("value")  >=
@DecimalMax("value") <= 
@NegativeOrZero <=0
@Range(min,max) 被注釋的元素大小必須在指定的范圍內 
@Size(min ,max) 被注釋的元素大小必須在指定的范圍內
@Email 被注釋的元素必須是電子郵箱地址
@Past 被注釋的元素必須是一個過去的日期
@PastOrPresent  被注釋的元素必須是一個過去的時間
@Future 被注釋的元素必須是一個將來的日期
@Pattern(regexp = "1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$")  被注釋的元素必須是符合指定的正則表達式
@URL 被注釋的元素必須是鏈接地址
備注:參數(shù)校驗只有!= null的時候才生效

1.導入依賴

        <!--引入hibernate-validator,beanvalidator-->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.18.Final</version>
        </dependency>
        <!--el規(guī)范和tomcat的實現(xiàn),用于解析message里面的表達式-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
            <version>9.0.29</version>
        </dependency>

springboot依賴

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

2.測試

//1.定義實體類
@Data
public class UserInfo{
@NotBlank
private String name;
}
//2.編寫工具類
public class UserInfo{
    //聲明validator,線程安全的:所有的方法都可以使用這個對象,而不會產生線程安全的問題
    private static Validator validator;
    //初始化默認的validator對象
    static {validator = Validation.buildDefaultValidatorFactory().getValidator();}
    //校驗
 public static List<String> valid(UserInfo userInfo,Class<?>... groups){
        //如果被校驗對象userInfo沒有檢驗通過,則set里面就有校驗信息,返回出去
        Set<ConstraintViolation<UserInfo>> set = validator.validate(userInfo,groups);
        List<String> list = set.stream().map(v -> "屬性:" + v.getPropertyPath() + ",屬性值是:" + v.getInvalidValue()
                + ",校驗不通過的提示信息:" + v.getMessage()+",消息模板:"+v.getMessageTemplate()).collect(Collectors.toList());
        return list;
    }
}
//3.測試
public class ValidationTest {
  public static void main(String[] args) {
        UserInfo info = new UserInfo();
        info.setName("名字");
 }
List<String> valid1 = ValidationUtil.valid(info);
System.out.println(valid1);
//

返回結果:
[屬性:name,屬性值是:null,校驗不通過的提示信息:不能為空,消息模板:{javax.validation.constraints.NotBlank.message}]

3.自定義消息模板

@NotBlank(message = "姓名不能為空??!")
private String name;

返回結果:
[屬性:name,屬性值是:null,校驗不通過的提示信息:姓名不能為空??!,消息模板:姓名不能為空!!]

4.分組校驗

//1.定義實體類
public class UserInfo{
	//標記接口 新增,修改,刪除
    public interface Add extends Default {}
    public interface Update extends Default{}
    public interface Delete extends Default{}
    //默認組default,指定分組
    @Null(groups = {Add.class}) //只適用于新增
    @NotNull(groups = {Update.class,Delete.class})//只適用于修改/刪除
    private Long id;
    @NotBlank(message = "姓名不能為空?。?)
	private String name;}
//2.編寫工具類
 //校驗,要檢驗的對象,檢驗分組
    public static List<String> valid(UserInfo userInfo,Class<?>... groups){
        //如果被校驗對象userInfo沒有檢驗通過,則2set里面就有校驗信息,返回出去
        Set<ConstraintViolation<UserInfo>> set = validator.validate(userInfo,groups);
        List<String> list = set.stream().map(v -> "屬性:" + v.getPropertyPath() + ",屬性值是:" + v.getInvalidValue()
                + ",校驗不通過的提示信息:" + v.getMessage()+",消息模板:"+v.getMessageTemplate()).collect(Collectors.toList());
        return list;
    }
//3.測試
public class ValidationTest {
  public static void main(String[] args) {
        UserInfo info = new UserInfo();
        info.setName("名字");
 }
List<String> valid1 = ValidationUtil.valid(info,UserInfo.Add.class);
List<String> valid2 = ValidationUtil.valid(info,UserInfo.Update.class);
System.out.println(valid1);
System.out.println(valid2);

//結果
valid1[]
valid1[屬性:id,屬性值是:null,校驗不通過的提示信息:不能為null,消息模板:{javax.validation.constraints.NotNull.message}]

5.級聯(lián)校驗

//1.編寫實體類
public class UserInfo{
   @NotBlank(message = "姓名不能為空?。?)
    private String name;
    @Valid //被引用對象加上@valid注解,才可以完成級聯(lián)校驗
    private Grade grade;
    }
public class Grade {
    @NotBlank
    private String id;
}
//2.工具類同上
//3.測試
public class ValidationTest {
  public static void main(String[] args) {
        UserInfo info = new UserInfo();
        info.setName("名字");
       //添加grade
       Grade grade = new Grade();
       //grade.setId("123");
       info.setGrade(grade);
 }
 

//結果
 valid1[屬性:grade.id,屬性值是:null,校驗不通過的提示信息:不能為空,消息模板:{javax.validation.constraints.NotBlank.message}]

6.自定義注解

status的必須為1000/1001/1002

//1.編寫實體類
public class UserInfo{
@NotBlank(message = "姓名不能為空??!")
    private String name;
    @UserStatus
    private Integer status;
}
//2.1編寫注解要校驗的規(guī)則
  -繼承ConstraintValidator<UserStatus,Integer>,綁定要校驗的約束注解UserStatus,類型
public class UserStatusValidator implements ConstraintValidator<UserStatus,Integer> {
    @Override
    public void initialize(UserStatus constraintAnnotation) {
    }
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null){
            //沒有值,不校驗
            return true;
        }
        //設置要求之
        Set<Integer> set = new HashSet<>();
        set.add(1000);
        set.add(1001);
        set.add(1002);
        return set.contains(value);
    }
}
//2.2編寫注解聲明類
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {UserStatusValidator.class})//說明當前注解要被誰來完成校驗工作
@Documented
public @interface UserStatus {
    String message() default "{userStatus必須是1000/1001/1002}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
//3.測試
public class ValidationTest {
  public static void main(String[] args) {
        UserInfo info = new UserInfo();
        info.setName("名字");
        info.setStatus(200);
        List<String> valid1 = ValidationUtil.valid(info);
        System.out.println("valid1"+valid1);
 }
 

//結果
 valid1[屬性:status,屬性值是:200,校驗不通過的提示信息:{userStatus必須是1000/1001/1002},消息模板:{userStatus必須是1000/1001/1002}, 屬性:grade,屬性值是:null,校驗不通過的提示信息:不能為空,消息模板:{org.hibernate.validator.constraints.NotEmpty.message}]

7.快速校驗

//1.實體類 同上
//2.工具類
public class ValidationUtil {
   //配置快速失敗
    private static Validator validFailFast;
    static {
        validFailFast = Validation.byProvider(HibernateValidator.class).configure()
            .failFast(true).buildValidatorFactory().getValidator();//.failFast(true),快速失敗
    }
    public static<T> List<String> validNotBean(T object, Method method, Object[] parameterValues, Class<?>... groups){
        Set<ConstraintViolation<T>> set = executables.validateParameters(object, method, parameterValues, groups);
        List<String> list = set.stream().map(v -> "屬性:" + v.getPropertyPath() + ",屬性值是:" + v.getInvalidValue()
                + ",校驗不通過的提示信息:" + v.getMessage()+",消息模板:"+v.getMessageTemplate()).collect(Collectors.toList());
        return list;
    }
 //   3.測試類同上
 //   調用:  
    List<String> valid = ValidationUtil.validFailFast(info,UserInfo.Add.class);
 //   效果:當有錯誤時,直接返回第一個錯誤,不再校驗其他錯誤。

8.非bean入?yún)⑿r?/h3>

請求參數(shù)和返回值并不是一個bean

//1.編寫要校驗的方法
    /**
     * 方法非bean類型的入?yún)⑿r?
     * 1.方法參數(shù)前加注解
     * 2.執(zhí)行入?yún)⑿r?,真正有用的話可以使用aop編程思想來使用
     */
    public String getByName(@NotBlank String name){
        //執(zhí)行入?yún)⑿r?
        //當前線程的堆棧,第一個元素就是當前所在方法的名字
        StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[1];
        String methodName = stackTraceElement.getMethodName();
        Method method = null;
        try{
            method = this.getClass().getDeclaredMethod(methodName, String.class);
        }catch (Exception e) {
            e.printStackTrace();
        }
        List<String> strings = ValidationUtil.validNotBean(this, method, new Object[]{name});
        //打印校驗結果
        System.out.println("校驗結果:" + strings);
        return "ok";
    }
//2.工具類編寫
public class ValidationUtil {
  private static ExecutableValidator executables;
 static {
    validator = Validation.buildDefaultValidatorFactory().getValidator();
    //校驗入?yún)⒒蚍祷刂档?
     executables = validator.forExecutables();
    }
  public static<T> List<String> validNotBean(T object, Method method, Object[] parameterValues, Class<?>... groups){
  		//校驗方法參數(shù) validateParameters
        Set<ConstraintViolation<T>> set = executables.validateParameters(object, method, parameterValues, groups);
        List<String> list = set.stream().map(v -> "屬性:" + v.getPropertyPath() + ",屬性值是:" + v.getInvalidValue()
                + ",校驗不通過的提示信息:" + v.getMessage()+",消息模板:"+v.getMessageTemplate()).collect(Collectors.toList());
        return list;
    }
}
//3.測試
method.getByName("");

返回結果
校驗結果:[屬性:getByName.arg0,屬性值是:,校驗不通過的提示信息:不能為空,消息模板:{javax.validation.constraints.NotBlank.message}]

9.與SpringBoot整合

1.編程式校驗

直接使用工具類校驗
 @GetMapping("/addUser")
    public String getByName(UserInfo userInfo){
        List<String> valid = ValidationUtil.valid(userInfo);
        if (valid.size()>0){
            System.out.println(valid);
            return "校驗不成功";
        }else {
        return "添加成功!";}
    }

訪問:http:8080/addUser
結果:校驗不成功  控制臺打印報錯

2.聲明式校驗

 @GetMapping("/addUser2")
    public String getByName2(@Valid UserInfo userInfo){
        return "添加成功";}
//結果:頁面直接報錯
//將校驗結果封裝到BindingResult,不會頁面上報錯
    @GetMapping("/addUser2")
    public String getByName2(@Valid UserInfo userInfo, BindingResult result){
        if(result.hasErrors()){//判斷是否有不滿足約束的
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
      			//打印錯誤信息
                System.out.println(error.getObjectName()+"::"+error.getDefaultMessage());
            }
            //獲取沒通過校驗的字段詳情
            List<FieldError> fieldErrorList = result.getFieldErrors();
            for (FieldError fieldError : fieldErrorList) {
                System.out.println(fieldError.getField() + "::" + fieldError.getDefaultMessage() + ",當前沒有通過校驗規(guī)則的值是:" + fieldError.getRejectedValue());
            }
        };
        return "添加成功";
    }

3.@Validated 實現(xiàn)分組校驗

 @GetMapping("/addUser3")
    public String getByName3(@Validated(value = {UserInfo.Add.class}) UserInfo userInfo, BindingResult result){
        if(result.hasErrors()){//判斷是否有不滿足約束的
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                System.out.println(error.getObjectName()+"::"+error.getDefaultMessage());
            }
            //獲取沒通過校驗的字段詳情
            List<FieldError> fieldErrorList = result.getFieldErrors();
            for (FieldError fieldError : fieldErrorList) {
                System.out.println(fieldError.getField() + "::" + fieldError.getDefaultMessage() + ",當前沒有通過校驗規(guī)則的值是:" + fieldError.getRejectedValue());
            }
        };
        return "添加成功";
    }

@Validated方法參數(shù)校驗

@Validated//表示整個類都啟用校驗,如果碰到入?yún)⒑衎ean validation注解的話就會自動校驗
@GetMapping("/getByName")
    public String getByName(@NotBlank String name){
        return name;
    }

10.統(tǒng)一異常處理

不寫B(tài)indingResult result

方式一:添加一個方法,使用@ExceptionHandler(BindException.class)標記,處理當前controller里拋出的xx異常

@ExceptionHandler(BindException.class)
public String handleEx(BindException e){
        List<FieldError> fieldErrors = e.getFieldErrors();
        StringBuilder builder = new StringBuilder();
        for (FieldError fieldError : fieldErrors) {
            builder.append("屬性:").append(fieldError.getField()).append("校驗不通過的原因:").append(fieldError.getDefaultMessage()).append(";;");
        }
        return builder.toString();
    }

方式二:編寫統(tǒng)一的異常處理方式

@ControllerAdvice
public class RoadControllerAdvice {
    /**
     *@Validated 寫在方法上的時候會報這個異常
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public String handleEx(BindException e){
        List<FieldError> fieldErrors = e.getFieldErrors();
        StringBuilder builder = new StringBuilder("RoadControllerAdvice里的:");
        for (FieldError fieldError : fieldErrors) {
            builder.append("屬性:").append(fieldError.getField()).append("校驗不通過的原因:").append(fieldError.getDefaultMessage()).append(";;");
        }
        return builder.toString();
    }
    /**
     * @Validated 寫在類上的時候會報這個異常
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public List<String> handleEx(ConstraintViolationException e){
        Set<ConstraintViolation<?>> fieldErrors = e.getConstraintViolations();
        StringBuilder builder = new StringBuilder("RoadControllerAdvice里的:");
        List<String> list = fieldErrors.stream().map(v -> "屬性:" + v.getPropertyPath() + ",屬性值是:" + v.getInvalidValue()
                + ",校驗不通過的提示信息:" + v.getMessage()+",消息模板:"+v.getMessageTemplate()).collect(Collectors.toList());
        return list;
    }
    /**
     * 處理所有異常信息
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String handleEx(Exception e){
        return e.getMessage();
    }
}

到此這篇關于Java的validation參數(shù)校驗代碼實例的文章就介紹到這了,更多相關validation參數(shù)校驗代碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java并發(fā)編程學習之Unsafe類與LockSupport類源碼詳析

    Java并發(fā)編程學習之Unsafe類與LockSupport類源碼詳析

    這篇文章主要給大家介紹了關于Java并發(fā)編程學習之Unsafe類與LockSupport類源碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-06-06
  • serialVersionUID作用全面解析

    serialVersionUID作用全面解析

    這篇文章全面解析了java中serialVersionUID的作用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java Swing最詳細基礎知識總結

    Java Swing最詳細基礎知識總結

    這篇文章主要介紹了Java Swing最詳細基礎知識總結,文中有非常詳細的代碼示例,對正在學習Java Swing的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應代碼示例

    SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應代碼示例

    這篇文章主要給大家介紹了關于SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應的相關資料,前端負責展示頁面和用戶交互,而后端則負責處理業(yè)務邏輯和數(shù)據(jù)存儲,在這種架構下前端需要將用戶輸入的數(shù)據(jù)發(fā)送給后端進行處理,需要的朋友可以參考下
    2023-12-12
  • 詳解 Java HashMap 實現(xiàn)原理

    詳解 Java HashMap 實現(xiàn)原理

    這篇文章主要介紹了詳解 Java HashMap 實現(xiàn)原理的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java 使用Docker時經常遇到的五個問題

    Java 使用Docker時經常遇到的五個問題

    這篇文章主要介紹了Java 使用Docker時經常遇到的五個問題的相關資料,需要的朋友可以參考下
    2016-10-10
  • 一文詳解Java中Stream流的使用

    一文詳解Java中Stream流的使用

    JDK8新增了Stream(流操作)處理集合的數(shù)據(jù),可執(zhí)行查找、過濾和映射數(shù)據(jù)等操作.本文將通過一些實例介紹stream流的使用,需要的可以參考一下
    2022-05-05
  • java中創(chuàng)建兩表之間的觸發(fā)器詳解

    java中創(chuàng)建兩表之間的觸發(fā)器詳解

    這篇文章主要介紹了java中創(chuàng)建兩表之間的觸發(fā)器詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-06-06
  • SpringBoot整合Swagger2實例方法

    SpringBoot整合Swagger2實例方法

    在本篇文章里小編給大家整合了關于SpringBoot整合Swagger2的相關知識點內容,有興趣的朋友們學習下。
    2019-06-06
  • java編程中實現(xiàn)調用js方法分析

    java編程中實現(xiàn)調用js方法分析

    這篇文章主要介紹了java編程中實現(xiàn)調用js方法,結合具體實例形式較為詳細的分析了java編程中調用js方法的常用操作技巧與注意事項,需要的朋友可以參考下
    2017-09-09

最新評論

防城港市| 元阳县| 且末县| 平潭县| 会宁县| 天等县| 渝中区| 金平| 唐海县| 武宣县| 永川市| 巴东县| 西峡县| 东丰县| 广丰县| 宜兴市| 东乡| 黎平县| 当阳市| 林州市| 牡丹江市| 绥滨县| 甘孜| 益阳市| 深泽县| 奎屯市| 揭东县| 溆浦县| 呼玛县| 龙州县| 吕梁市| 阳新县| 平泉县| 河南省| 红原县| 武邑县| 始兴县| 两当县| 绩溪县| 应城市| 通城县|