SpringMVC中@controllerAdvice注解的詳細(xì)解釋
這是一個(gè)增強(qiáng)的 Controller。使用這個(gè) Controller ,可以實(shí)現(xiàn)三個(gè)方面的功能:
1.全局異常處理;
2.全局?jǐn)?shù)據(jù)綁定
3.全局?jǐn)?shù)據(jù)預(yù)處理
1.全局異常處理
使用 @ControllerAdvice 實(shí)現(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; } }
@ExceptionHandler 注解用來指明異常的處理類型,即如果這里指定為 NullpointerException,則數(shù)組越界異常就不會(huì)進(jìn)到這個(gè)方法中來。
2.全局?jǐn)?shù)據(jù)綁定
全局?jǐn)?shù)據(jù)綁定功能可以用來做一些初始化的數(shù)據(jù)操作,我們可以將一些公共的數(shù)據(jù)定義在添加了 @ControllerAdvice 注解的類中,這樣,在每一個(gè) Controller 的接口中,就都能夠訪問導(dǎo)致這些數(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 注解標(biāo)記該方法的返回?cái)?shù)據(jù)是一個(gè)全局?jǐn)?shù)據(jù),默認(rèn)情況下,這個(gè)全局?jǐn)?shù)據(jù)的 key 就是返回的變量名,value 就是方法返回值,當(dāng)然開發(fā)者可以通過 @ModelAttribute 注解的 name 屬性去重新指定 key。
定義完成后,在任何一個(gè)Controller 的接口中,都可以獲取到這里定義的數(shù)據(jù):
@RestController public class HelloController { @GetMapping("/hello") public String hello(Model model) { Map<String, Object> map = model.asMap(); System.out.println(map); } }
輸出結(jié)果:
3.全局?jǐn)?shù)據(jù)預(yù)處理
考慮我有兩個(gè)實(shí)體類,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í),如果我定義一個(gè)數(shù)據(jù)添加接口,如下:
@PostMapping("/book") public void addBook(Book book, Author author) { System.out.println(book); System.out.println(author); }
這個(gè)時(shí)候,添加操作就會(huì)有問題,因?yàn)閮蓚€(gè)實(shí)體類都有一個(gè) name 屬性,從前端傳遞時(shí) ,無(wú)法區(qū)分。此時(shí),通過 @ControllerAdvice 的全局?jǐn)?shù)據(jù)預(yù)處理可以解決這個(gè)問題
解決步驟如下:
1.給接口中的變量取別名
@PostMapping("/book") public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) { System.out.println(book); System.out.println(author); }
2.進(jìn)行請(qǐng)求數(shù)據(jù)預(yù)處理
在 @ControllerAdvice 標(biāo)記的類中添加如下代碼:
@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ù)添加一個(gè) b 前綴,即請(qǐng)求參數(shù)要有b前綴.
總結(jié)
到此這篇關(guān)于SpringMVC中@controllerAdvice注解的文章就介紹到這了,更多相關(guān)SpringMVC中@controllerAdvice注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JDBC PreparedStatement Like參數(shù)報(bào)錯(cuò)解決方案
這篇文章主要介紹了JDBC PreparedStatement Like參數(shù)報(bào)錯(cuò)解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10springboot實(shí)現(xiàn)單文件和多文件上傳
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)單文件和多文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11springboot bean掃描路徑的實(shí)現(xiàn)
這篇文章主要介紹了springboot bean掃描路徑的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Java設(shè)計(jì)實(shí)現(xiàn)一個(gè)針對(duì)各種類型的緩存
這篇文章主要為大家詳細(xì)介紹了Java如何設(shè)計(jì)實(shí)現(xiàn)一個(gè)針對(duì)各種類型的緩存,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-11-11