SpringMVC中的@ControllerAdvice使用場景詳解
@ControllerAdvice使用場景
在Spring MVC進行調(diào)用的過程中,會有很多的特殊的需求。比如全局異常,分頁信息和分頁搜索條件,請求時帶來返回時還得回顯頁面。
Spring提供@ControllerAdvice對需要處理的范圍進行配置。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { // 控制的掃描包范圍 @AliasFor("basePackages") String[] value() default {}; // 控制的掃描包范圍 @AliasFor("value") String[] basePackages() default {}; // 控制的包類 Class<?>[] basePackageClasses() default {}; // @Controller或者@RestController的類 的數(shù)據(jù) Class<?>[] assignableTypes() default {}; // 控制范圍可以用注解進行配置 Class<? extends Annotation>[] annotations() default {}; }
1、ExceptionHandler
系統(tǒng)比較龐大時很多的異常是不能控制,或者未知的,不能將所有的sql異常,反射異常,類不存在等拋到頁面上展示給用戶。
則需要一個全局的攔截器處理,Spring 提供了@ExceptionHandler處理方式。
1)、全局異常處理定義
@ControllerAdvice(basePackages = "com.kevin.tool") public class ExceptionHandlerController { /** * 錯誤后返回json * 如果想跳轉(zhuǎn)到專門的異常界面,則可以返回{@link org.springframework.web.servlet.ModelAndView} * * @return 標準異常json */ @ResponseBody @ExceptionHandler(Exception.class) public Map<String, String> handler() { Map<String, String> errorMap = new HashMap<String, String>(16); errorMap.put("code", "500"); errorMap.put("msg", "系統(tǒng)異常,請稍后重試"); return errorMap; } }
2)、控制器方法調(diào)用異常
@RestController public class ControllerAdviceDemoController { @ResponseBody @RequestMapping("bindException") public String bindException() { getMessage(); return "ok"; } private void getMessage() { throw new RuntimeException("未知異常!"); } }
3)、訪問效果
2、InitBinder
數(shù)據(jù)綁定有很多的場景,當前比如前端傳入的日期為字符串類型,后端按照Format進解析為日期。
1)、全局日期綁定定義
@ControllerAdvice(basePackages = "com.kevin.tool") public class ExceptionHandlerController { @InitBinder("date") public void globalInitBinder(WebDataBinder binder) { binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); } }
2)、控制器方法調(diào)用日期轉(zhuǎn)換
@RestController public class ControllerAdviceDemoController { @ResponseBody @RequestMapping(value = "/initBind", method = RequestMethod.GET) public String detail(@RequestParam("id") long id, Date date) { System.out.println(date); System.out.println(id); return "ok"; } }
3)、收到的日期類型效果
訪問地址為://127.0.0.1:9999/initBind?id=123&date=2019-12-30
3、ModelAttribute
先看看@ModelAttribute的注解信息,元注解@Target指定可以修飾方法參數(shù)和方法(全局)。當前模擬一種常見,就是將所有輸出的信息都加上當前的平臺信息(比如版本等公共信息,這種需求還是比較多的)。
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean binding() default true; }
1)、全局返回屬性添加
@ControllerAdvice(basePackages = "com.kevin.tool") public class ExceptionHandlerController { @ModelAttribute public void addAttributes(Model model) { model.addAttribute("msg", "hello"); HashMap<String, String> map = new HashMap<>(16); map.put("version", "1.0.0"); map.put("name", "XXX平臺"); model.addAttribute("platform", map); } }
2)、控制器方法訪問
@RestController public class ControllerAdviceDemoController { @GetMapping("/modelAttributeTest") private String modelAttributeTest(@ModelAttribute("msg") String msg, @ModelAttribute("platform") Map<String, String> platform) { String result = "msg:" + msg + "<br>" + "info:" + platform; return result; } }
3)、輸出效果
到此這篇關(guān)于SpringMVC中的@ControllerAdvice使用場景詳解的文章就介紹到這了,更多相關(guān)@ControllerAdvice使用場景內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC結(jié)合模板模式實現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)
我們經(jīng)常會遇到需要傳遞對象的場景,有時候,我們需要將一個對象的數(shù)據(jù)傳遞給另一個對象進行處理,但是又不希望直接暴露對象的內(nèi)部結(jié)構(gòu)和實現(xiàn)細節(jié),所以本文給大家介紹了SpringMVC結(jié)合模板模式實現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù),需要的朋友可以參考下2024-03-03深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用
po vo bo dto dao 和 pojo 是軟件開發(fā)中經(jīng)常使用的一些概念,用于設(shè)計和實現(xiàn)對象模型,下面將分別解釋這些概念的含義及其在開發(fā)中的應(yīng)用,這篇文章主要給大家介紹了關(guān)于Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用的相關(guān)資料,需要的朋友可以參考下2024-08-08解決logback使用${spring.application.name}日志打印路徑的問題
這篇文章主要介紹了解決logback使用${spring.application.name}日志打印路徑的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06Spring使用Configuration注解管理bean的方式詳解
在Spring的世界里,Configuration注解就像是一位細心的園丁,它的主要職責(zé)是在這個繁花似錦的園子里,幫助我們聲明和管理各種各樣的bean,本文給大家介紹了在Spring中如何優(yōu)雅地管理你的bean,需要的朋友可以參考下2024-05-05SpringBoot配置Access-Control-Allow-Origin教程
文章介紹了三種配置Spring Boot跨域訪問的方法:1. 使用過濾器;2. 在WebConfig配置文件中設(shè)置;3. 通過注解配置,作者分享了個人經(jīng)驗,并鼓勵讀者支持腳本之家2025-03-03