SpringBoot(八):系統錯誤統一攔截器


在日常 web 開發中發生了異常,往往需要通過一個統一的 異常處理,來保證客戶端能夠收到友好的提示。本文將會介紹 Spring Boot 中的 全局統一異常處理。

Springboot的全局異常查是通過兩個注解@ControllerAdvice和@ExceptionHandler來實現的。
只有代碼出錯或者throw出來的異常才會被捕捉處理,如果被catch的異常,就不會被捕捉,除非catch之后再throw異常。

@ControllerAdvice:增強型控制器,對於控制器的全局配置放在同一個位置,全局異常的注解,放在類上。
@ControllerAdvice默認只會處理controller層拋出的異常,如果需要處理service層的異常,需要定義一個自定義的MyException來繼承RuntimeException類,然后@ExceptionHandler(MyException)即可。
@ExceptionHandler:指明需要處理的異常類型以及子類。注解放在方法上面。

項目設置

GlobalExceptionHandler.java

package com.dx.controller;

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

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice(basePackages = "com.dx.controller")
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map<String, Object> errorResult() {
        Map<String, Object> errorResult = new HashMap<String, Object>();
        errorResult.put("errorCode", "500");
        errorResult.put("errorMsg", "AOP捕獲全局異常。");
        return errorResult;
    }

    // ⒈全局異常處理返回字符串
    @ExceptionHandler(MyPageException.class)
    @ResponseBody
    public String exception(MyPageException e) {// 未知的異常做出響應
        return "MyPageException";
    }

    // ⒉全局異常處理返回JSON
    @ExceptionHandler(value = MyJsonException.class)
    @ResponseBody
    public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyJsonException e) throws Exception {
        ErrorInfo<String> r = new ErrorInfo<String>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setData("Some Data");
        r.setUrl(req.getRequestURL().toString());
        return r;
    }

    // ⒊全局異常處理返回JSP
    @ExceptionHandler(MyJspException.class)
    public String exception(Exception e) {
        return "MyJspException";
    }
}

ErrorInfo.java

package com.dx.controller;

public class ErrorInfo<T> {
    public static final Integer OK = 0;
    public static final Integer ERROR = 100;
    private Integer code;
    private String message;
    private String url;
    private T data;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

}
View Code

MyJsonException.java

package com.dx.controller;

public class MyJsonException extends Exception {
    public MyJsonException(String message) {
        super(message);
    }
}

MyJspException.java

package com.dx.controller;

public class MyJspException extends Exception {
    public MyJspException(String message) {
        super(message);
    }
}

MyPageException.java

package com.dx.controller;

public class MyPageException extends Exception {
    public MyPageException(String message) {
        super(message);
    }
}

App.java

package com.dx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

測試類:

TestController.java

package com.dx.controller.member;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.dx.controller.MyJsonException;
import com.dx.controller.MyJspException;
import com.dx.controller.MyPageException;

@Controller
public class TestController {
    @RequestMapping("/json")
    public String json() throws MyJsonException {
        if (1 == 1)
            throw new MyJsonException("");

        return "index";
    }

    @RequestMapping("/jsp")
    public String jsp() throws MyJspException {
        if (1 == 1)
            throw new MyJspException("");

        return "index";
    }

    @RequestMapping("/page")
    public String page() throws MyPageException {
        if (1 == 1)
            throw new MyPageException("");

        return "index";
    }

    @RequestMapping("/common1")
    public String common1() throws RuntimeException {
        if (1 == 1)
            throw new RuntimeException("");

        return "index";
    }

    @RequestMapping("/common2")
    public String common2() throws Exception {
        int i = 2 / 0;

        return "index";
    }
}

測試1 json:

http://localhost:8080/json

測試2 page:

http://localhost:8080/page

測試3 jsp:

http://localhost:8080/jsp

:需要配置一下才能支持jsp

①需要在pom添加JSP的支持

        <!-- 對JSP的解析支持 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency> <!-- 對JSTL的支持 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

②需要配置application.properties

在src/main/resources下添加application.properties配置文件,並配置如下內容:

# \u9875\u9762\u9ED8\u8BA4\u524D\u7F00\u76EE\u5F55 
spring.mvc.view.prefix=/WEB-INF/ 
# \u54CD\u5E94\u9875\u9762\u9ED8\u8BA4\u540E\u7F00 
spring.mvc.view.suffix=.jsp

③需要添加jsp文件

 

測試4 common1,common2:

http://localhost:8080/common1

 

http://localhost:8080/common2

 

 


免責聲明!

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



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