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í) ,無法區(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)文章
Java使用Spring JdbcTemplate向in語句中傳遞參數(shù)的教程詳解
這篇文章主要給大家介紹Java如何使用Spring JdbcTemplate向in語句中傳遞參數(shù),文中有詳細(xì)的流程步驟和代碼示例,需要的朋友可以參考下2023-07-07
聊聊注解@controller@service@component@repository的區(qū)別
這篇文章主要介紹了聊聊注解@controller@service@component@repository的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot參數(shù)校驗(yàn)的方法總結(jié)
今天帶大家學(xué)習(xí)SpringBoot參數(shù)校驗(yàn)的方法,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
基于接口實(shí)現(xiàn)java動(dòng)態(tài)代理示例
這篇文章主要介紹了基于接口實(shí)現(xiàn)java動(dòng)態(tài)代理示例,需要的朋友可以參考下2014-04-04
SpringBoot自定義啟動(dòng)器Starter流程詳解
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾2022-11-11
Java中判斷對(duì)象是否相等的equals()方法使用教程
與==運(yùn)算符響應(yīng),equals()方法也是Java中對(duì)對(duì)象進(jìn)行比較的一大方式,要特別注意二者的不同點(diǎn),這個(gè)我們?cè)谙挛闹屑磳⒅v到,接下來我們就來看一下Java中判斷對(duì)象是否相等的equals()方法使用教程2016-05-05
springBoot 整合ModBus TCP的詳細(xì)過程
ModBus是一種串行通信協(xié)議,用于從儀器和控制設(shè)備傳輸信號(hào)到主控制器或數(shù)據(jù)采集系統(tǒng),它分為主站和從站,主站獲取和編寫數(shù)據(jù),從站則是設(shè)備,本文給大家介紹springBoot 整合ModBus TCP的詳細(xì)過程,感興趣的朋友一起看看吧2025-01-01

