@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的方法 他可以幹很多事情
都是可以的
那麼這就說到這裏了 我們夢凡 加油!