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

SpringBoot+Hibernate實現(xiàn)自定義數(shù)據(jù)驗證及異常處理

 更新時間:2022年04月22日 16:00:06   作者:花傷情猶在  
這篇文章主要為大家介紹了SpringBoot如何整合Hibernate自定義數(shù)據(jù)驗證及多種方式異常處理,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

前言

在進行 SpringBoot 項目開發(fā)中,經(jīng)常會碰到屬性合法性問題,而面對這個問題通常的解決辦法就是通過大量的 if 和 else 判斷來解決的,例如:

@PostMapping("/verify")
    @ResponseBody
    public Object verify(@Valid User user){
        if (StringUtils.isEmpty(user.getName())){
            return "姓名不能為空";
        }
        if (StringUtils.isEmpty(user.getAge())){
            return "姓名不能為空";
        }
        if (!StringUtils.isEmpty(user.getSex())&&user.getSex().equals("男")&&user.getSex().equals("女")){
            return "性別有誤";
        }
        return user;
    }

這種代碼寫法十分麻煩,試想一下如果你有10個、20個字段屬性,你也要跟著寫十幾二十幾個 if 和 else 判斷?

So,本文講解一下使用Hibernate框架來去驗證字段屬性,使用相應(yīng)的注解即可實現(xiàn)字段合法性校驗,以及如何自定義注解進行校驗,包括出現(xiàn)異常的幾種處理方式。

Hibernate實現(xiàn)字段校驗

Maven依賴

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

常用的校驗注解

注解釋義
@Null必須為null
@NotNull不能為null
@AssertTrue必須為true
@AssertFalse必須為false
@Min必須為數(shù)字,其值大于或等于指定的最小值
@Max必須為數(shù)字,其值小于或等于指定的最大值
@DecimalMin必須為數(shù)字,其值大于或等于指定的最小值
@DecimalMax必須為數(shù)字,其值小于或等于指定的最大值
@Size集合的長度
@Digits必須為數(shù)字,其值必須再可接受的范圍內(nèi)
@Past必須是過去的日期
@Future必須是將來的日期
@Pattern必須符合正則表達式
@Email必須是郵箱格式
@Length長度范圍
@NotEmpty不能為null,長度大于0
@Range元素的大小范圍
@NotBlank不能為null,字符串長度大于0(限字符串)

定義User實體類

@Data
public class User {
    @NotBlank(message = "姓名不能為空")
    private String name;
    @NotBlank(message = "年齡不能為空")
    private String age;
}

定義UserController

@Controller
public class UserController {

    @PostMapping("/verify")
    @ResponseBody
    public Object verify(@Valid User user, BindingResult result){
    	//字段校驗有錯誤
        if (result.hasErrors()){
        	//獲取錯誤字段信息
            List<FieldError> fieldErrors = result.getFieldErrors();
            if (fieldErrors!=null){
            	//創(chuàng)建一個map用來封裝字段錯誤信息
                HashMap<String, String> map = new HashMap<>();
                //遍歷錯誤字段
                fieldErrors.forEach(x->{
                	//獲取字段名稱
                    String field = x.getField();
                    //獲取字段錯誤提示信息
                    String msg = x.getDefaultMessage();
                    //存入map
                    map.put(field, msg);
                });
                return map;
            }
        }
        return user;
    }

}

啟動項目進行測試

可以看到name和age的錯誤信息已經(jīng)封裝好傳回來了

自定義校驗注解

自定義一個校驗性別的注解Sex

/**
 * 性別約束
 * @Target用于指定使用范圍,該處限定只能在字段上使用
 * @Retention(RetentionPolicy.RUNTIME)表示注解在運行時可以通過反射獲取到
 * @Constraint(validatedBy = xxx.class)指定該注解校驗邏輯
 */
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SexConstraintValidator.class)
public @interface Sex {

    String message() default "性別有誤";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

創(chuàng)建SexConstraintValidator校驗邏輯類

/**
 * 性別約束邏輯判斷
 */
public class SexConstraintValidator implements ConstraintValidator<Sex, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && (value.equals("男") || value.equals("女"));
    }

}

修改User實體類

@Data
public class User {
    @NotBlank(message = "姓名不能為空")
    private String name;
    @NotBlank(message = "年齡不能為空")
    private String age;
    @Sex(message = "性別不能為空或有誤")
    private String sex;
}

重啟項目測試效果

使用AOP處理校驗異常

Maven依賴

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

這里我們用注解作為AOP的切入點,新建一個注解 BindingResultAnnotation

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BindingResultAnnotation {
}

定義參數(shù)校驗切面類

/**
 * 參數(shù)校驗切面類
 */
@Aspect
@Component
public class BindingResultAspect {

    /**
     * 校驗切入點
     */
    @Pointcut("@annotation(com.hsqyz.hibernate.config.aop.BindingResultAnnotation)")
    public void BindingResult() {
    }

    /**
     * 環(huán)繞通知
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("BindingResult()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("參數(shù)校驗切面...");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg instanceof BindingResult) {
                BindingResult result = (BindingResult) arg;
                if (result.hasErrors()){
                    List<FieldError> fieldErrors = result.getFieldErrors();
                    if (fieldErrors!=null){
                        HashMap<String, String> map = new HashMap<>();
                        fieldErrors.forEach(x->{
                            String field = x.getField();
                            String msg = x.getDefaultMessage();
                            map.put(field, msg);
                        });
                        return map;
                    }
                }

            }
        }
        return joinPoint.proceed();
    }


}

修改UserController

注意:這里將新建的切面注解添加到方法上@BindingResultAnnotation,必須攜帶BindingResult result在參數(shù)后面,否則AOP無法獲取錯誤信息,導(dǎo)致AOP無法處理異常。

@Controller
public class UserController {

    @PostMapping("/verify")
    @ResponseBody
    @BindingResultAnnotation
    public Object verify(@Valid User user, BindingResult result) {
        return user;
    }

}

重啟項目查看效果

全局異常類處理異常

創(chuàng)建GlobelExceptionHandler來處理全局異常,使用@ExceptionHandle來攔截指定異常,由于參數(shù)校驗拋出的異常是BindException,所以我們需要攔截BindException異常,而BindException內(nèi)部封裝這錯誤信息,這樣就可以用全局異常處理類來封裝字段錯誤信息返回。

/**
 * 全局異常處理
 */
@ControllerAdvice
public class GlobelExceptionHandler {

    /**
     * 參數(shù)驗證異常處理
     * @param result
     * @return
     */
    @ResponseBody
    @ExceptionHandler(BindException.class)
    public Object bindExceptionHandler(BindingResult result) {
        System.out.println("參數(shù)驗證異常處理...");
        if (result.hasErrors()){
            List<FieldError> fieldErrors = result.getFieldErrors();
            if (fieldErrors!=null){
                HashMap<String, String> map = new HashMap<>();
                fieldErrors.forEach(x->{
                    String field = x.getField();
                    String msg = x.getDefaultMessage();
                    map.put(field, msg);
                });
                return map;
            }
        }
        return result.getAllErrors();
    }


}

修改UserController

注意:這個時候我們就需要去掉verify()方法中的BindingResult result參數(shù),因為不去掉的話,出現(xiàn)錯誤信息不會拋出異常,會被收集起來封裝到BindingResult中去,所以要想使用全局異常處理類來處理校驗異常,就必須去掉BindingResult參數(shù),讓其拋出異常,我們再使用全局異常處理類進行異常處理,封裝異常信息并返回。

@Controller
public class UserController {

    @PostMapping("/verify")
    @ResponseBody
    public Object verify(@Valid User user) {
        return user;
    }

}

重啟項目查看運行效果

到此這篇關(guān)于SpringBoot+Hibernate實現(xiàn)自定義數(shù)據(jù)驗證及異常處理的文章就介紹到這了,更多相關(guān)SpringBoot Hibernate數(shù)據(jù)驗證 異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計模式筆記之Builder模式

    Java設(shè)計模式筆記之Builder模式

    建造者模式是日常開發(fā)中比較常見的設(shè)計模式,它的主要作用就是將復(fù)雜事物創(chuàng)建的過程抽象出來,該抽象的不同實現(xiàn)方式不同,創(chuàng)建出的對象也不同,這篇文章主要給大家介紹了關(guān)于Java設(shè)計模式筆記之Builder模式的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • spring-mybatis與原生mybatis使用對比分析

    spring-mybatis與原生mybatis使用對比分析

    這篇文章主要介紹了spring-mybatis與原生mybatis使用對比分析,需要的朋友可以參考下
    2017-11-11
  • Java實戰(zhàn)之基于swing的QQ郵件收發(fā)功能實現(xiàn)

    Java實戰(zhàn)之基于swing的QQ郵件收發(fā)功能實現(xiàn)

    這篇文章主要介紹了Java實戰(zhàn)之基于swing的QQ郵件收發(fā)功能實現(xiàn),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 如何測試Java類的線程安全性

    如何測試Java類的線程安全性

    這篇文章主要介紹了如何測試Java類的線程安全性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java多線程產(chǎn)生死鎖的必要條件

    Java多線程產(chǎn)生死鎖的必要條件

    今天小編就為大家分享一篇關(guān)于Java多線程產(chǎn)生死鎖的必要條件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java實現(xiàn)簡易的五子棋游戲

    java實現(xiàn)簡易的五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡易的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java HashTable的原理與實現(xiàn)

    Java HashTable的原理與實現(xiàn)

    Java中的HashTable是一種線程安全的哈希表實現(xiàn),它可以高效地存儲和快速查找數(shù)據(jù),本文將介紹Java中的HashTable的實現(xiàn)原理、常用方法和測試用例,需要的小伙伴可以參考一下
    2023-09-09
  • Java反射簡易教程

    Java反射簡易教程

    這篇文章主要介紹了Java反射簡易教程,小編覺得挺不錯的,這里分享給大家,需要的朋友可以參考。
    2017-11-11
  • SpringCloud分布式項目下feign的使用示例詳解

    SpringCloud分布式項目下feign的使用示例詳解

    這篇文章主要介紹了SpringCloud分布式項目下feign的使用,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java 通過cmd 調(diào)用命令啟動tomcat的操作

    java 通過cmd 調(diào)用命令啟動tomcat的操作

    這篇文章主要介紹了java 通過cmd 調(diào)用命令啟動tomcat的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論

牡丹江市| 新密市| 四川省| 多伦县| 本溪| 巴中市| 扎囊县| 清涧县| 英吉沙县| 金平| 杭锦后旗| 广安市| 襄城县| 友谊县| 永昌县| 通渭县| 台前县| 舟山市| 柯坪县| 日照市| 安徽省| 马尔康县| 张家界市| 通辽市| 丁青县| 依安县| 桐梓县| 无极县| 曲靖市| 左权县| 石渠县| 历史| 含山县| 山东| 兰考县| 兴义市| 通道| 晋州市| 含山县| 洪江市| 开平市|