SpringMVC @ControllerAdvice使用場景
這篇文章主要介紹了SpringMVC @ControllerAdvice使用場景,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
@ControllerAdvice ,很多初學(xué)者可能都沒有聽說過這個注解,實際上,這是一個非常有用的注解,顧名思義,這是一個增強的 Controller。使用這個 Controller ,可以實現(xiàn)三個方面的功能:
- 全局異常處理
- 全局數(shù)據(jù)綁定
- 全局數(shù)據(jù)預(yù)處理
靈活使用這三個功能,可以幫助我們簡化很多工作,需要注意的是,這是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分別來看。
全局異常處理
使用 @ControllerAdvice 實現(xiàn)全局異常處理,只需要定義類,添加該注解即可定義方式如下:
@ControllerAdvice public class MyGlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView customException(Exception e) { ModelAndView mv = new ModelAndView(); mv.addObject("message", e.getMessage()); mv.setViewName("myerror"); return mv; } }
在該類中,可以定義多個方法,不同的方法處理不同的異常,例如專門處理空指針的方法、專門處理數(shù)組越界的方法…,也可以直接向上面代碼一樣,在一個方法中處理所有的異常信息。
@ExceptionHandler 注解用來指明異常的處理類型,即如果這里指定為 NullpointerException,則數(shù)組越界異常就不會進到這個方法中來。
全局數(shù)據(jù)綁定
全局數(shù)據(jù)綁定功能可以用來做一些初始化的數(shù)據(jù)操作,我們可以將一些公共的數(shù)據(jù)定義在添加了 @ControllerAdvice 注解的類中,這樣,在每一個 Controller 的接口中,就都能夠訪問導(dǎo)致這些數(shù)據(jù)。
使用步驟,首先定義全局數(shù)據(jù),如下:
@ControllerAdvice public class MyGlobalExceptionHandler { @ModelAttribute(name = "md") public Map<String,Object> mydata() { HashMap<String, Object> map = new HashMap<>(); map.put("age", 99); map.put("gender", "男"); return map; } }
使用 @ModelAttribute 注解標記該方法的返回數(shù)據(jù)是一個全局數(shù)據(jù),默認情況下,這個全局數(shù)據(jù)的 key 就是返回的變量名,value 就是方法返回值,當然開發(fā)者可以通過 @ModelAttribute 注解的 name 屬性去重新指定 key。
定義完成后,在任何一個Controller 的接口中,都可以獲取到這里定義的數(shù)據(jù):
@RestController public class HelloController { @GetMapping("/hello") public String hello(Model model) { Map<String, Object> map = model.asMap(); System.out.println(map); int i = 1 / 0; return "hello controller advice"; } }
全局數(shù)據(jù)預(yù)處理
考慮我有兩個實體類,Book 和 Author,分別定義如下:
public class Book { private String name; private Long price; //getter/setter } public class Author { private String name; private Integer age; //getter/setter }
此時,如果我定義一個數(shù)據(jù)添加接口,如下:
@PostMapping("/book") public void addBook(Book book, Author author) { System.out.println(book); System.out.println(author); }
這個時候,添加操作就會有問題,因為兩個實體類都有一個 name 屬性,從前端傳遞時 ,無法區(qū)分。此時,通過 @ControllerAdvice 的全局數(shù)據(jù)預(yù)處理可以解決這個問題
解決步驟如下:
1.給接口中的變量取別名
@PostMapping("/book") public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) { System.out.println(book); System.out.println(author); }
2.進行請求數(shù)據(jù)預(yù)處理
在 @ControllerAdvice 標記的類中添加如下代碼:
@InitBinder("b") public void b(WebDataBinder binder) { binder.setFieldDefaultPrefix("b."); } @InitBinder("a") public void a(WebDataBinder binder) { binder.setFieldDefaultPrefix("a."); }
@InitBinder(“b”) 注解表示該方法用來處理和Book和相關(guān)的參數(shù),在方法中,給參數(shù)添加一個 b 前綴,即請求參數(shù)要有b前綴.
3.發(fā)送請求
請求發(fā)送時,通過給不同對象的參數(shù)添加不同的前綴,可以實現(xiàn)參數(shù)的區(qū)分.
總結(jié)
這就是松哥給大伙介紹的 @ControllerAdvice 的幾個簡單用法,這些點既可以在傳統(tǒng)的 SSM 項目中使用,也可以在 Spring Boot + Spring Cloud 微服務(wù)中使用,歡迎大家有問題一起討論。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法
這篇文章主要介紹了Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法,文中舉了用其啟動線程和設(shè)置線程優(yōu)先級的例子,需要的朋友可以參考下2016-03-03Java 對 Properties 文件的操作詳解及簡單實例
這篇文章主要介紹了Java 對 Properties 文件的操作詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下2017-02-02- 這篇文章將通過Java實現(xiàn)一個簡答的圖書管理系統(tǒng),本圖書管理系統(tǒng)用對象數(shù)組的方式來提供操作方法,比較特別,建議新手學(xué)習(xí),這對理解Java面向?qū)ο笥泻艽髱椭?/div> 2022-11-11
Dubbo+zookeeper搭配分布式服務(wù)的過程詳解
Dubbo作為分布式架構(gòu)比較后的框架,同時也是比較容易入手的框架,適合作為分布式的入手框架,下面是簡單的搭建過程,對Dubbo+zookeeper分布式服務(wù)搭建過程感興趣的朋友一起看看吧2022-04-04最新評論