国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot中@ControllerAdvice的三種使用場景

這篇具有很好參考價值的文章主要介紹了SpringBoot中@ControllerAdvice的三種使用場景。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、全局異常處理

代碼示例如下:

/**
 * @author qinxun
 * @date 2023-06-14
 * @Descripion: 業(yè)務(wù)層異常枚舉
 */
public enum ServiceExceptionEnum {
    SUCCESS(0, "成功"),
    ERROR(1, "失敗"),
    SYS_ERROR(1000, "服務(wù)端發(fā)生異常"),
    MISSING_REQUEST_PARAM_ERROR(1001, "參數(shù)缺失"),
    INVALID_REQUEST_PARAM_ERROR(1002, "請求參數(shù)不合法");

    private final String message;

    private final int code;

    ServiceExceptionEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public int getCode() {
        return code;
    }
}
import com.example.quartzdemo.enums.ServiceExceptionEnum;

import java.io.Serializable;

/**
 * @author qinxun
 * @date 2023-06-14
 * @Descripion: 統(tǒng)一返回結(jié)果實體類
 */
public class CommonResult<T> implements Serializable {


    /**
     * 錯誤碼
     */
    private Integer code;
    /**
     * 錯誤提示
     */
    private String message;
    /**
     * 返回數(shù)據(jù)
     */
    private T data;

    /**
     * 成功
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> success(T data) {
        CommonResult<T> commonResult = new CommonResult<>();
        commonResult.setCode(ServiceExceptionEnum.SUCCESS.getCode());
        commonResult.setMessage(ServiceExceptionEnum.SUCCESS.getMessage());
        commonResult.setData(data);
        return commonResult;
    }

    /**
     * 失敗
     *
     * @param message
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> error(String message) {
        CommonResult<T> commonResult = new CommonResult<>();
        commonResult.setCode(ServiceExceptionEnum.ERROR.getCode());
        commonResult.setMessage(message);
        return commonResult;
    }

    /**
     * 失敗
     *
     * @param message
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> error(int code, String message) {
        CommonResult<T> commonResult = new CommonResult<>();
        commonResult.setCode(code);
        commonResult.setMessage(message);
        return commonResult;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "CommonResult{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}

全局異常處理類:

import com.example.quartzdemo.common.CommonResult;
import com.example.quartzdemo.enums.ServiceExceptionEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

/**
 * @author qinxun
 * @date 2023-06-14
 * @Descripion: 全局異常處理
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 處理 MissingServletRequestParameterException 異常
     * <p>
     * SpringMVC 參數(shù)不正確
     */
    @ResponseBody
    @ExceptionHandler(value = MissingServletRequestParameterException.class)
    public CommonResult<String> missingServletRequestParameterExceptionHandler(HttpServletRequest req, MissingServletRequestParameterException ex) {
        log.error("[missingServletRequestParameterExceptionHandler]", ex);
        // 包裝 CommonResult 結(jié)果
        return CommonResult.error(ServiceExceptionEnum.MISSING_REQUEST_PARAM_ERROR.getCode(),
                ServiceExceptionEnum.MISSING_REQUEST_PARAM_ERROR.getMessage());
    }

    @ResponseBody
    @ExceptionHandler(value = ConstraintViolationException.class)
    public CommonResult<String> constraintViolationExceptionHandler(HttpServletRequest req, ConstraintViolationException ex) {
        log.error("[constraintViolationExceptionHandler]", ex);
        // 拼接錯誤
        StringBuilder detailMessage = new StringBuilder();
        for (ConstraintViolation<?> constraintViolation : ex.getConstraintViolations()) {
            // 使用 ; 分隔多個錯誤
            if (detailMessage.length() > 0) {
                detailMessage.append(";");
            }
            // 拼接內(nèi)容到其中
            detailMessage.append(constraintViolation.getMessage());
        }
        // 包裝 CommonResult 結(jié)果
        return CommonResult.error(
                ServiceExceptionEnum.INVALID_REQUEST_PARAM_ERROR.getMessage() + ":" + detailMessage.toString());
    }

    /**
     * 處理參數(shù)校驗異常
     *
     * @param req
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = BindException.class)
    public CommonResult<String> bindExceptionHandler(HttpServletRequest req, BindException ex) {
        log.info("========進(jìn)入了 bindException======");
        log.error("[bindExceptionHandler]", ex);
        // 拼接錯誤
        StringBuilder detailMessage = new StringBuilder();
        for (ObjectError objectError : ex.getAllErrors()) {
            // 使用 ; 分隔多個錯誤
            if (detailMessage.length() > 0) {
                detailMessage.append(";");
            }
            // 拼接內(nèi)容到其中
            detailMessage.append(objectError.getDefaultMessage());
        }
        // 包裝 CommonResult 結(jié)果
        return CommonResult.error(ServiceExceptionEnum.INVALID_REQUEST_PARAM_ERROR.getCode(),
                ServiceExceptionEnum.INVALID_REQUEST_PARAM_ERROR.getMessage() + ":" + detailMessage.toString());
    }

    /**
     * 處理參數(shù)校驗異常
     *
     * @param req
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public CommonResult<String> MethodArgumentNotValidExceptionHandler(HttpServletRequest req, MethodArgumentNotValidException ex) {
        log.info("-----------------進(jìn)入了 MethodArgumentNotValidException-----------------");
        log.error("[MethodArgumentNotValidException]", ex);
        // 拼接錯誤
        StringBuilder detailMessage = new StringBuilder();
        for (ObjectError objectError : ex.getBindingResult().getAllErrors()) {
            // 使用 ; 分隔多個錯誤
            if (detailMessage.length() > 0) {
                detailMessage.append(";");
            }
            // 拼接內(nèi)容到其中
            detailMessage.append(objectError.getDefaultMessage());
        }
        // 包裝 CommonResult 結(jié)果
        return CommonResult.error(ServiceExceptionEnum.INVALID_REQUEST_PARAM_ERROR.getCode(),
                ServiceExceptionEnum.INVALID_REQUEST_PARAM_ERROR.getMessage() + ":" + detailMessage.toString());
    }


    /**
     * 處理其它 Exception 異常
     *
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public CommonResult<String> exceptionHandler(HttpServletRequest req, Exception e) {
        // 記錄異常日志
        log.error("[exceptionHandler]", e);
        // 返回 ERROR CommonResult
        return CommonResult.error(ServiceExceptionEnum.SYS_ERROR.getCode(),
                ServiceExceptionEnum.SYS_ERROR.getMessage());
    }
}

二、全局?jǐn)?shù)據(jù)綁定

全局?jǐn)?shù)據(jù)綁定可以用來做一些初始化數(shù)據(jù)的操作,我們可以將一些公共的數(shù)據(jù)定義到添加了@ControllerAdvice注解的類中,這樣我們就可以在每一個Controller中可以訪問這些數(shù)據(jù)。

1.定義全局?jǐn)?shù)據(jù)綁定類

import java.util.HashMap;
import java.util.Map;

/**
 * @author qinxun
 * @date 2023-06-15
 * @Descripion: 全局?jǐn)?shù)據(jù)綁定
 */
@ControllerAdvice
public class GlobalDataBindHandler {

    @ModelAttribute(name = "gd")
    public Map<String, Object> globalData() {
        Map<String, Object> map = new HashMap<>();
        map.put("website", "https://www.xx.com/");
        map.put("email", "xxxx@qq.com");
        return map;
    }
}

使用@ModelAttribute注解標(biāo)記該方法返回的是一個全局?jǐn)?shù)據(jù)。

2.我們在Controller類中使用這個全局?jǐn)?shù)據(jù)

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @author qinxun
 * @date 2023-06-15
 * @Descripion: 全局?jǐn)?shù)據(jù)綁定測試
 */
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String toHello(Model model) {
        Map<String, Object> map = model.asMap();
        // 輸出 {map={website=https://www.xx.com/, email=xxxx@qq.com}}
        System.out.println(map);
        return "hello";
    }
}

三、全局?jǐn)?shù)據(jù)預(yù)處理

1.我們準(zhǔn)備兩個實體類

/**
 * @author qinxun
 * @date 2023-06-15
 * @Descripion: Author實體
 */
public class Author {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Author{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
/**
 * @author qinxun
 * @date 2023-06-15
 * @Descripion: Book實體
 */
public class Book {

    private String name;

    private Integer price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

我們定義一個訪問接口

import com.example.quartzdemo.bean.Author;
import com.example.quartzdemo.bean.Book;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qinxun
 * @date 2023-06-15
 * @Descripion: 測試
 */
@RestController
public class TestController {


    /**
     * 測試
     *
     * @param book   Book對象
     * @param author Author對象
     */
    @PostMapping("/book")
    public void addBook(Book book, Author author) {
        System.out.println(book);
        System.out.println(author);
    }
}

這個時候,我們的添加操作就會有問題,因為這兩個實體類中都有一個name的屬性,前端傳遞數(shù)據(jù)的時候,無法區(qū)分是哪個實體的name屬性,這種情況我們可以通過@ControllerAdvice的全局?jǐn)?shù)據(jù)預(yù)處理來解決這個問題。

我們在postman上進(jìn)行測試

SpringBoot中@ControllerAdvice的三種使用場景

?控制臺打印返回文章來源地址http://www.zghlxwxcb.cn/news/detail-485166.html

Book{name='書名,作者', price=20}
Author{name='書名,作者', age=20}

發(fā)現(xiàn)數(shù)據(jù)混亂了,這不是我們需要的結(jié)果。

如何解決?

1.給接口中的變量取別名

import com.example.quartzdemo.bean.Author;
import com.example.quartzdemo.bean.Book;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qinxun
 * @date 2023-06-02
 * @Descripion: 測試
 */
@RestController
public class TestController {


    /**
     * 測試
     *
     * @param book   Book對象
     * @param author Author對象
     */
    @PostMapping("/book")
    public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) {
        System.out.println(book);
        System.out.println(author);
    }
}

2.全局?jǐn)?shù)據(jù)處理類

import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;

import java.util.HashMap;
import java.util.Map;

/**
 * @author qinxun
 * @date 2023-06-15
 * @Descripion: 全局?jǐn)?shù)據(jù)處理
 */
@ControllerAdvice
public class GlobalDataBindHandler {

    // 全局?jǐn)?shù)據(jù)綁定
    @ModelAttribute
    public Map<String, Object> globalData() {
        Map<String, Object> map = new HashMap<>();
        map.put("website", "https://www.xx.com/");
        map.put("email", "xxxx@qq.com");
        return map;
    }

    // 對命名為b的全局?jǐn)?shù)據(jù)預(yù)處理
    @InitBinder("b")
    public void b(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("b.");
    }

    // 對命名為a的全局?jǐn)?shù)據(jù)預(yù)處理
    @InitBinder("a")
    public void a(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("a.");
    }
}

@InitBinder("b")表示該方法用來處理和Book相關(guān)的參數(shù),給參數(shù)添加一個b前綴,要求參數(shù)必須有b前綴。

3.postman測試

SpringBoot中@ControllerAdvice的三種使用場景

?控制臺打印返回

Book{name='書名', price=20}
Author{name='作者', age=20}

到了這里,關(guān)于SpringBoot中@ControllerAdvice的三種使用場景的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • SpringBoot 增強(qiáng)Controller方法,@ControllerAdvice注解的使用

    SpringBoot 增強(qiáng)Controller方法,@ControllerAdvice注解的使用

    參考資料 @ControllerAdvice 用法 SpringBoot使用@ControllerAdvice注解 @ControllerAdvice ,是Spring3.2提供的新注解,它是一個Controller增強(qiáng)器,可對controller進(jìn)行增強(qiáng)處理。 配合 @ExceptionHandler 注解,進(jìn)行全局異常處理。 配合 @InitBinder 注解,用來設(shè)置 WebDataBinder ,用于自動綁定前臺請求參數(shù)到

    2024年02月08日
    瀏覽(27)
  • 金融級低代碼的三種應(yīng)用場景和六個特色能力建設(shè)

    金融級低代碼的三種應(yīng)用場景和六個特色能力建設(shè)

    低代碼平臺在企業(yè)數(shù)字化轉(zhuǎn)型中發(fā)揮著重要的作用,助力降低成本、提升效率。尤其對于金融行業(yè)而言,其規(guī)模龐大、復(fù)雜多變,各級分行、業(yè)務(wù)線以及科技部門都有使用低代碼平臺來增強(qiáng)效能的需求。 對于領(lǐng)導(dǎo)層 而言,要實現(xiàn)數(shù)字化轉(zhuǎn)型在一線分支機(jī)構(gòu)的全面推進(jìn),不能

    2024年01月18日
    瀏覽(21)
  • springboot依賴注入的三種方式

    springboot依賴注入的三種方式 在 Spring Boot 中,使用 XML 配置依賴注入(DI)時,需要使用 bean 元素來定義 bean,并使用 property 元素來為 bean 的屬性注入值或依賴對象。 以下是一個簡單的示例: 在 src/main/resources 目錄下創(chuàng)建 applicationContext.xml 文件。 在該文件中定義一個 testBean

    2023年04月23日
    瀏覽(25)
  • 【SpringBoot】獲取HttpServletRequest的三種方式

    線程安全 缺點: 每個方法都需要寫一遍 線程安全 在 Spring 中, DemoRequestController 的 scope 是 singleton (單例),也就是說在整個 web 系統(tǒng)中,只有一個 DemoRequestController ;但是其中注入的 request 卻是線程安全的,原因在于:使用這種方式,當(dāng) Bean (本例的 DemoRequestController )初始化

    2024年02月12日
    瀏覽(20)
  • 【SpringBoot18】SpringBoot 調(diào)用外部接口的三種方式

    【SpringBoot18】SpringBoot 調(diào)用外部接口的三種方式

    SpringBoot不僅繼承了Spring框架原有的優(yōu)秀特性,而且還通過簡化配置來進(jìn)一步簡化了Spring應(yīng)用的整個搭建和開發(fā)過程。在Spring-Boot項目開發(fā)中,存在著本模塊的代碼需要訪問外面模塊接口,或外部url鏈接的需求, 比如在apaas開發(fā)過程中需要封裝接口在接口中調(diào)用apaas提供的接口(

    2023年04月11日
    瀏覽(35)
  • SpringBoot實現(xiàn)分頁的三種方式

    一 自己封裝Page對象實現(xiàn) 博客鏈接 二 使用sql實現(xiàn)分頁 2.1 場景分析 前段傳遞給給后臺什么參數(shù)? 當(dāng)前頁碼 currentPage 每頁顯示條數(shù) pageSize 后臺給前端返回什么數(shù)據(jù)? 當(dāng)前頁數(shù)據(jù) List 總記錄數(shù) totalCount 2.2 前段代碼 2.3 后端代碼 PageBean mapper service impl controller 三 使用PageHelper插件

    2024年02月10日
    瀏覽(29)
  • SpringBoot獲取HttpServletRequest、HttpServletResponse的三種方式

    SpringBoot獲取HttpServletRequest、HttpServletResponse的三種方式

    僅僅適用在controller方法上。當(dāng)Spring接收到HTTP請求時,會尋找一個合適的方法來處理該請求。如果該方法參數(shù)上標(biāo)注了@RequestMapping或@Get、@Post等注解,Spring就會將HttpServletRequest對象注入到該參數(shù)中。 適用于所有的bean 通過調(diào)試可以看到,注入的Reques是一個代理類,而這個被代

    2024年02月19日
    瀏覽(25)
  • SpringBoot導(dǎo)出Word文檔的三種方式

    SpringBoot導(dǎo)出Word文檔的三種方式

    1、直接在Java代碼里創(chuàng)建Word文檔,設(shè)置格式樣式等,然后導(dǎo)出。(略) 需要的見:https://blog.csdn.net/qq_42682745/article/details/120867432 2、富文本轉(zhuǎn)換后的HTML下載為Word文檔。相當(dāng)于把HTML轉(zhuǎn)為Word導(dǎo)出 3、使用模板技術(shù)導(dǎo)出。固定格式、可以寫入不同數(shù)據(jù) 其他: springboot版本:2.7.11 導(dǎo)

    2024年02月02日
    瀏覽(22)
  • SpringBoot獲取Request請求的三種方式

    Request對象包含了請求的各種信息,比如請求方法、請求URL、請求參數(shù)、請求內(nèi)容等等,這些信息可以供服務(wù)器進(jìn)行處理和響應(yīng)。那么在SpringBoot中,怎么才能獲取到Request對象? 本文將介紹三種方法,并提示例參考。 一、直接在Controller方法參數(shù)上注入HttpServletRequest 這是最常用

    2024年02月04日
    瀏覽(25)
  • SpringBoot實現(xiàn)過濾器Filter的三種方式

    SpringBoot實現(xiàn)過濾器Filter的三種方式

    過濾器 Filter 由 Servlet 提供,基于函數(shù)回調(diào)實現(xiàn)鏈?zhǔn)綄W(wǎng)絡(luò)請求與響應(yīng)的攔截與修改。由于基于 Servlet ,其可以對web服務(wù)器管理的幾乎所有資源進(jìn)行攔截(JSP、圖片文件、HTML 文件、CSS文件等)。 Filter 的生命周期 init(): 初始化Filter 實例,F(xiàn)ilter 的生命周期與 Servlet 是相同的,

    2024年02月14日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包