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

使用@Validated注解異常信息的處理方式

 更新時間:2025年07月31日 09:01:03   作者:艾默絲  
本文優(yōu)化Spring @Validated參數(shù)校驗異常信息,通過MethodArgumentNotValidException和BindingResult提取關鍵錯誤,使用@RestControllerAdvice實現(xiàn)統(tǒng)一異常處理,提升錯誤信息簡潔性及代碼可維護性

使用@Validated注解異常信息的處理

我在使用spring提供的注解@Validated進行參數(shù)校驗時,發(fā)現(xiàn)默認的異常有點過于雜亂,本文就對這個問題優(yōu)化一下。

首先是接收參數(shù)的dto

  • StoreItemInfoDto .java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StoreItemInfoDto {
    @Field(name = "二維碼中心-批次id")
    @NotNull(message = "centerRecordId為空,請檢查")
    private Integer centerRecordId;
}

//接收請求的方法
MultiResponse<CodeInfoItemVo> queryCodeInfos(@Validated @RequestBody(required = true) StoreItemInfoDto storeItemInfoDto);

請求參數(shù)校驗失敗

我發(fā)現(xiàn)返回的信息過于雜亂且長,其實只需要最后“[ ]”里面的信息,今天就來對這個異常優(yōu)化一下。

解決方案

寫一個spring的統(tǒng)一異常處理,使用@ExceptionHandler注解標注,通過字符串截取“[ ]”里面的信息就可以

這樣返回的錯誤信息就簡潔明了

今天又發(fā)現(xiàn)了一個更為簡潔的寫法,這里用到MethodArgumentNotValidException異常類,查看其源碼,它對exception拋出的異常先進行了處理,而且它將校驗信息封裝到了BindingResult對象里面,我們可以直接根據getFieldErrors()方法拿到校驗不通過的信息;

  • MethodArgumentNotValidException.java
public class MethodArgumentNotValidException extends Exception {
    private final MethodParameter parameter;
    private final BindingResult bindingResult;

    public MethodArgumentNotValidException(MethodParameter parameter, BindingResult bindingResult) {
        this.parameter = parameter;
        this.bindingResult = bindingResult;
    }

    public MethodParameter getParameter() {
        return this.parameter;
    }

    public BindingResult getBindingResult() {
        return this.bindingResult;
    }
	//這里對異常進行了封裝
    public String getMessage() {
        StringBuilder sb = (new StringBuilder("Validation failed for argument [")).append(this.parameter.getParameterIndex()).append("] in ").append(this.parameter.getExecutable().toGenericString());
        if (this.bindingResult.getErrorCount() > 1) {
            sb.append(" with ").append(this.bindingResult.getErrorCount()).append(" errors");
        }

        sb.append(": ");
        Iterator var2 = this.bindingResult.getAllErrors().iterator();

        while(var2.hasNext()) {
            ObjectError error = (ObjectError)var2.next();
            sb.append("[").append(error).append("] ");
        }

        return sb.toString();
    }
}

基于MethodArgumentNotValidException這個類我們可以把方法改寫為如下:

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public SingleResponse<?> handlerException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String errorMsg = bindingResult.getFieldErrors().stream().map(o -> o.getDefaultMessage()).collect(Collectors.joining(","));
        return SingleResponse.buildFailure(ResultCodeEnum.CONSTRAINT_VIOLATION_ERROR.getCode(), errorMsg);
    }

拓展

@RestControllerAdvice是一個組合注解,由@ControllerAdvice、@ResponseBody組成,而@ControllerAdvice繼承了@Component,因此@RestControllerAdvice本質上是個Component,用于定義@ExceptionHandler,@InitBinder和@ModelAttribute方法,適用于所有使用@RequestMapping方法。

@RestControllerAdvice的特點:

  • 1.通過@ControllerAdvice注解可以將對于控制器的全局配置放在同一個位置。
  • 2.注解了@RestControllerAdvice的類的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
  • 3.@RestControllerAdvice注解將作用在所有注解了@RequestMapping的控制器的方法上。
  • 4.@ExceptionHandler:用于指定異常處理方法。當與@RestControllerAdvice配合使用時,用于全局處理控制器里的異常。
  • 5.@InitBinder:用來設置WebDataBinder,用于自動綁定前臺請求參數(shù)到Model中。
  • 6.@ModelAttribute:本來作用是綁定鍵值對到Model中,當與@ControllerAdvice配合使用時,可以讓全局的@RequestMapping都能獲得在此處設置的鍵值對

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java開發(fā)之內部類對象的創(chuàng)建及hook機制分析

    Java開發(fā)之內部類對象的創(chuàng)建及hook機制分析

    這篇文章主要介紹了Java開發(fā)之內部類對象的創(chuàng)建及hook機制,結合實例形式分析了java基于hook機制內部類對象的創(chuàng)建與使用,需要的朋友可以參考下
    2018-01-01
  • Java中的JSONObject使用及錯誤處理詳解

    Java中的JSONObject使用及錯誤處理詳解

    這篇文章主要給大家介紹了關于Java中的JSONObject使用及錯誤處理的相關資料,文中講解了Java中的JSONObject創(chuàng)建、基本操作、高級特性和錯誤處理,通過示例代碼和方法說明,使讀者能夠理解和掌握JSONObject的使用技巧,需要的朋友可以參考下
    2024-12-12
  • java打成jar后,獲取resources下的文件資源問題及解決

    java打成jar后,獲取resources下的文件資源問題及解決

    作者在寫代碼時遇到一個問題:在將項目打包成jar包后,無法通過常規(guī)方式獲取resources文件夾下的資源,通過分析原因,作者找到了一種新的解決方案,即通過類加載器獲取jar包內的資源,此方式返回后的資源以文件流的形式返回,作者將其轉換為了byte[]的形式使用
    2026-05-05
  • Java8 使用流抽取List<T>集合中T的某個屬性操作

    Java8 使用流抽取List<T>集合中T的某個屬性操作

    這篇文章主要介紹了Java8 使用流抽取List<T>集合中T的某個屬性操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • eclipse如何搭建Springboot項目詳解

    eclipse如何搭建Springboot項目詳解

    今天帶大家學習eclipse如何搭建Spring boot項目,文中有非常詳細的圖文解說,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 基于springboot i18n國際化后臺多種語言設置的方式

    基于springboot i18n國際化后臺多種語言設置的方式

    這篇文章主要介紹了基于springboot i18n國際化后臺多種語言設置的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • HashMap之keyset()方法底層原理解讀

    HashMap之keyset()方法底層原理解讀

    這篇文章主要介紹了HashMap之keyset()方法底層原理解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 解決IDEA中pom.xml文件變?yōu)榛疑膯栴}

    解決IDEA中pom.xml文件變?yōu)榛疑膯栴}

    這篇文章主要給大家介紹了如何解決IDEA中pom.xml文件變?yōu)榛疑膯栴},文中通過圖文結合給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • Java詳細講解不同版本的接口語法和抽象類與接口的區(qū)別

    Java詳細講解不同版本的接口語法和抽象類與接口的區(qū)別

    對于面向對象編程來說,抽象是它的一大特征之一,在?Java?中可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關于Java入門基礎之抽象類與接口的相關資料,需要的朋友可以參考下
    2022-04-04
  • Spark學習筆記之Spark中的RDD的具體使用

    Spark學習筆記之Spark中的RDD的具體使用

    這篇文章主要介紹了Spark學習筆記之Spark中的RDD的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06

最新評論

青浦区| 巴彦县| 潞城市| 青海省| 韩城市| 宣恩县| 加查县| 府谷县| 特克斯县| 嘉义县| 吉林省| 大同市| 东丽区| 会泽县| 灵山县| 蒲江县| 彩票| 遂宁市| 界首市| 杨浦区| 万源市| 肃宁县| 延边| 宜良县| 舟山市| 唐山市| 开平市| 新巴尔虎右旗| 县级市| 霞浦县| 龙泉市| 建瓯市| 青海省| 长兴县| 丹寨县| 松原市| 新宁县| 象山县| 江津市| 登封市| 资阳市|