SpringBoot使用 @ExceptionHandler 做 自定義異常處理


目的是,更友好的頁面訪問。

自定義的異常捕獲類

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class CustomExtHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomExtHandler.class);

    @ExceptionHandler(value = {Exception.class})
    Object handleException(Exception e, HttpServletRequest request){
        LOGGER.error("url: {}, msg: {}", request.getRequestURL(), e.getMessage());
        Map<String, Object> map = new HashMap<>();
        map.put("code", 100);
        map.put("msg", e.getMessage());
        map.put("url", request.getRequestURL());

        return map;
    }

}

 

 這里的  @ExceptionHandler(value = {Exception.class}) , 表示 捕獲 全部異常。

注意:

  • 添加注解@ControllerAdvice 。

  • 如果是返回json數據 則用 @RestControllerAdvice,就可以不加 @ResponseBody。

 

通過 controller 模擬異常。

@RequestMapping(value = "/api/v1/test_ext")
public Object index(){
    int i= 1/0;
    return new User(29,"abc","139",new Date());
}

 

 

測試,訪問 http://localhost:8080/api/v1/test_ext 

{
"msg": "/ by zero",
"code": 100,
"url": "http://localhost:8080/api/v1/test_ext"
}

 

返回自定義的頁面

設置捕獲的處理方法,在CustomExtHandler,添加方法。

 

@ExceptionHandler(value = {MyException.class})
Object handleMyException(MyException e, HttpServletRequest request){
    //進行頁面跳轉
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("error.html");
    modelAndView.addObject("msg", e.getMsg());
    return modelAndView;
}

 

 這里做了 自定義的 頁面跳轉。 不適合 前后端分離的開發模式。

 

還是返回 json 更好。

return new MyException("601", "自定義的錯誤頁面,給到前台。");

 

 

 自定義返回的Json。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyException extends RuntimeException {
    private String code;
    private String msg;
}

 


免責聲明!

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



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