Spring MVC中@ControllerAdvice注解實現全局異常攔截


在網上很多都把Advice翻譯成增強器,其實從翻譯工具上看到,這個單詞翻譯是忠告,通知的意思。

首先這個注解實在Spring Web包下,而Spring MVC離不開Spring Web的依賴,所以經常兩個一起使用的。

題外:如果在asp.net webform下可以做這樣的事情有兩處地方,全部集成Base或者Globals去攔截,而在asp.net webmvc下提供了指定類進行注入,Globals同樣也有,並且可以實現,但提倡這個,mvc已經有了新的類實現全局,以上是dotnet的等等。

@ControllerAdvice的做可以可以全局攔截指定的異常,並做想要的包裝處理,比如跳轉到別的頁面,或者返回指定的數據格式等等。

下面是通過這個特定實現的簡單攔截:

1、新建MyControllerAdvice類

package com.jsoft.springboottest.springboottest1.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.NativeWebRequest;

import java.util.HashMap;
import java.util.Map;

/**
 * Controller增強器
 *
 * @author jim
 * @date 2017/11/23
 */
@ControllerAdvice
public class MyControllerAdvice {

    @ModelAttribute
    public void changeModel(Model model) {
        System.out.println("============應用到所有@RequestMapping注解方法,在其執行之前把返回值放入Model");
        model.addAttribute("author", "Jim");
    }

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        System.out.println("============應用到所有@RequestMapping注解方法,在其執行之前初始化數據綁定器");
    }


    /**
     * 設置要捕獲的異常,並作出處理
     * 注意:這里可以返回試圖,也可以放回JSON,這里就當做一個Controller使用
     *
     * @param request {@link NativeWebRequest}
     * @param e {@link Exception}
     * @return {@link Map}
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map processUnauthenticatedException(NativeWebRequest request, Exception e) {
        System.out.println("===========應用到所有@RequestMapping注解的方法,在其拋出Exception異常時執行");
        Map map = new HashMap(5);
        map.put("code", 404);
        map.put("msg", e.getMessage());
        return map;
    }
}

2、測試異常,模擬拋出異常

    @RequestMapping("/show")
    public String show() throws Exception {
        throw new Exception("測試異常");
    }

測試效果:

測試工程:https://github.com/easonjim/5_java_example/tree/master/springboottest/springboottest9

 

參考:

http://jinnianshilongnian.iteye.com/blog/1866350

https://www.cnblogs.com/magicalSam/p/7198420.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM