SpringMVC @ControllerAdvice使用場景
這篇文章主要介紹了SpringMVC @ControllerAdvice使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
@ControllerAdvice ,很多初學(xué)者可能都沒有聽說過這個注解,實(shí)際上,這是一個非常有用的注解,顧名思義,這是一個增強(qiáng)的 Controller。使用這個 Controller ,可以實(shí)現(xiàn)三個方面的功能:
- 全局異常處理
- 全局?jǐn)?shù)據(jù)綁定
- 全局?jǐn)?shù)據(jù)預(yù)處理
靈活使用這三個功能,可以幫助我們簡化很多工作,需要注意的是,這是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分別來看。
全局異常處理
使用 @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;
}
}
在該類中,可以定義多個方法,不同的方法處理不同的異常,例如專門處理空指針的方法、專門處理數(shù)組越界的方法…,也可以直接向上面代碼一樣,在一個方法中處理所有的異常信息。
@ExceptionHandler 注解用來指明異常的處理類型,即如果這里指定為 NullpointerException,則數(shù)組越界異常就不會進(jìn)到這個方法中來。
全局?jǐn)?shù)據(jù)綁定
全局?jǐn)?shù)據(jù)綁定功能可以用來做一些初始化的數(shù)據(jù)操作,我們可以將一些公共的數(shù)據(jù)定義在添加了 @ControllerAdvice 注解的類中,這樣,在每一個 Controller 的接口中,就都能夠訪問導(dǎo)致這些數(shù)據(jù)。
使用步驟,首先定義全局?jǐn)?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ù)是一個全局?jǐn)?shù)據(jù),默認(rèn)情況下,這個全局?jǐn)?shù)據(jù)的 key 就是返回的變量名,value 就是方法返回值,當(dāng)然開發(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";
}
}
全局?jǐn)?shù)據(jù)預(yù)處理
考慮我有兩個實(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ù)據(jù)添加接口,如下:
@PostMapping("/book")
public void addBook(Book book, Author author) {
System.out.println(book);
System.out.println(author);
}
這個時候,添加操作就會有問題,因?yàn)閮蓚€實(shí)體類都有一個 name 屬性,從前端傳遞時 ,無法區(qū)分。此時,通過 @ControllerAdvice 的全局?jǐn)?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.進(jìn)行請求數(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ù)添加一個 b 前綴,即請求參數(shù)要有b前綴.
3.發(fā)送請求
請求發(fā)送時,通過給不同對象的參數(shù)添加不同的前綴,可以實(shí)現(xiàn)參數(shù)的區(qū)分.

總結(jié)
這就是松哥給大伙介紹的 @ControllerAdvice 的幾個簡單用法,這些點(diǎn)既可以在傳統(tǒng)的 SSM 項(xiàng)目中使用,也可以在 Spring Boot + Spring Cloud 微服務(wù)中使用,歡迎大家有問題一起討論。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)搶紅包算法(公平版和手速版)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)搶紅包算法,分為公平版和手速版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法
這篇文章主要介紹了Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法,文中舉了用其啟動線程和設(shè)置線程優(yōu)先級的例子,需要的朋友可以參考下2016-03-03
Java 對 Properties 文件的操作詳解及簡單實(shí)例
這篇文章主要介紹了Java 對 Properties 文件的操作詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java實(shí)現(xiàn)圖書管理系統(tǒng)的示例代碼
這篇文章將通過Java實(shí)現(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最新評論

