@ControllerAdvice註解的三種用法

@ControllerAdvice註解的三種用法

1.處理全局異常

2.預設全局數據

3.請求參數預處理

處理全局異常

這裏我就借用之前寫的文件上傳進行演示

springboot文件上傳:點我查看

我們吧文件上傳最大大小設置爲1KB

那麼我們再次上傳文件就會拋出這個異常

MaxUploadSizeExceededException

我們創建一個calss

加上ControllerAdvice這個註解

我們先上代碼

@ControllerAdvice
public class myFileException {
    //文件大小超出異常處理
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public void fileMax(HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("文件大小超出限制");
        writer.flush();
        writer.close();
    }
}

當出現MaxUploadSizeExceededException這個異常時,會走這個方法

我們就會吧文件大小超出限制返回給前面

當然我們也可以使用thymeleaf模板返回model

這個用法比較的簡單

預設全局數據

首先我們創建一個類

代碼如下 比較簡單 就是返回一個map

@ControllerAdvice
public class GetData {

    @ModelAttribute(value = "dataMap")
    public Map<String,Object> getmap(){
        Map<String, Object> map =new HashMap<>();
        map.put("name","夢凡");
        map.put("age",20);
        return map;
    }
}

我們在controller的用法

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model){
        Map<String, Object>  map = model.asMap();
        //獲取map的視圖
        Set<String> strings = map.keySet();
        for (String key : strings) {
            System.out.println(key+":"+map.get(key));
        }
        return "hello";
    }
}

也比較簡單 我們需要通過model獲取到數據

然後我們進行了輸出

運行訪問hello打印出

在這裏插入圖片描述

是可以獲取到的 這個能講的不多 用法大致如此 會用即可

請求參數預處理

請求參數預處理 大家可能所遇到業務場景很少 但是呢如果遇到了 我們也能解決他

我舉一個小例子大家來感受下他的一個作用

首先創建兩個實體類

public class Book {
    private String name;
    private Double price;
}

public class Author {
    private String name;
    private Integer age;
}

然後分別給他們getset toString方法 我就不寫在這兒了 太長也沒意義

然後我們寫一個非常簡單的contorller

@RestController
public class BookController {

    @PostMapping("/book")
    public void SetBook(Book book,Author author){
        System.out.println(book);
        System.out.println(author);
    }  
}

我們使用postman來操作

如果沒有postman的可以看我這篇文章下載

postman下載:點我下載

在這裏插入圖片描述

控制檯打印

在這裏插入圖片描述

因爲有兩個name而系統識別不出來 那麼就合二爲一了

我們可以通過ControllerAdvice來解決這個問題

首先我們給接收參數的兩個實體類一個別名

@RestController
public class BookController {
    @PostMapping("/book")
    public void SetBook(@ModelAttribute("b") Book book,@ModelAttribute("a") Author author){
        System.out.println(book);
        System.out.println(author);
    }
}

然後創建一個類

@ControllerAdvice
public class GetData {
    @InitBinder("a")
    public void initA(WebDataBinder binder){
        binder.setFieldDefaultPrefix("a.");
    }
    @InitBinder("b")
    public void initB(WebDataBinder binder){
        binder.setFieldDefaultPrefix("b.");
    }
}

最上面我們一定要加上ControllerAdvice註解

然後我們吧a.的參數給a b.的參數給b

我們再來請求一次

在這裏插入圖片描述
這次postman的參數也要隨之改一下

那麼我們看結果
在這裏插入圖片描述

這樣就沒問題了

這只是他的一個用法

我們可以看下binder.set的方法 他可以幹很多事情

在這裏插入圖片描述

都是可以的

那麼這就說到這裏了 我們夢凡 加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章