全局異常處理
用@ControllerAdvice標記全局異常處理的類
項目地址:https://github.com/zz790609619/LeetCodeRecord.git
@ControllerAdvice
這是一個增強的 Controller標籤。使用這個 ControllerAdvice,可以實現三個方面的功能:
- 全局異常處理
- 設置全局變量,也就是設置完,每個接口能獲取到整個參數
- 數據預處理
@ControllerAdvice修飾的類
package com.example.demo.config;
import com.example.demo.entity.model.ResponseDto;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalControllerAdvice {
/**
* 所有異常處理
* @param request
* @param e
* @return
* @throws Exception
*/
@ExceptionHandler(value = Exception.class)
public @ResponseBody
ResponseDto exceptionHandler(HttpServletRequest request,Exception e)throws Exception{
ResponseDto dto=new ResponseDto();
dto.setErrorCode(1001);
dto.setMessage("Exception:"+e.getMessage());
return dto;
}
/**
* 空指針異常處理
* @param request
* @param e
* @return
* @throws NullPointerException
*/
@ExceptionHandler(value = NullPointerException.class)
public @ResponseBody
ResponseDto exceptionHandler(HttpServletRequest request,NullPointerException e)throws NullPointerException{
ResponseDto dto=new ResponseDto();
dto.setErrorCode(1002);
dto.setMessage("NullPointerException:"+e.getMessage());
return dto;
}
/**
* 全局變量
* @return
*/
@ModelAttribute(name="ww")
public Map<String,Object> globalData() {
HashMap<String, Object> map = new HashMap<>();
map.put("ww", "helloQ");
return map;
}
/**
* 數據預處理
* @param binder
*/
@InitBinder("helloA")
public void b(WebDataBinder binder) {
binder.setFieldDefaultPrefix("helloA.");
}
@InitBinder("helloB")
public void a(WebDataBinder binder) {
binder.setFieldDefaultPrefix("helloB.");
}
}
使用場景:
package com.example.demo.controller;
import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON;
import com.example.demo.entity.model.ResponseDto;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping(value = "/test")
public class UserNodeController {
@RequestMapping(value = "/index")
public String index(){
return "/index";
}
/**
* 異常報錯
* 訪問路徑:http://127.0.0.1:8090/test/exception
* 不走全局處理類結果:{"message": "NoEnterGlobalException" }
* 最後返回結果: {"errorCode": 1001,"message": "Exception:4","data": null }
*/
@RequestMapping(value = "/exception")
public ResponseDto getException(){
int[] arr = {1, 2, 3};
System.out.println(arr[4]);
ResponseDto dto=new ResponseDto();
dto.setMessage("NoEnterGlobalException");
return dto;
}
/**
* 空指針異常報錯
* 訪問路徑:http://127.0.0.1:8090/test/nullPointException
* 不走全局處理類結果:{"message": "NoEnterGlobalNullPointException" }
* 最後返回結果:{"errorCode": 1002,"message": "NullPointerException:null","data": null }
*/
@RequestMapping(value = "/nullPointException")
public ResponseDto getNullPointException(){
Object obj = null;
obj.toString();
ResponseDto dto=new ResponseDto();
dto.setMessage("NoEnterGlobalNullPointException");
return dto;
}
/**
* 獲取全局變量
* 訪問路徑:http://127.0.0.1:8090/test/getGlobalParm
* 返回結果:{"ww":{"ww":"helloQ"}}
*/
@RequestMapping(value = "/getGlobalParm")
public String getGlobalParm(Model model){
Map<String, Object> map = model.asMap();
return JSON.toJSONString(map);
}
/**
* 獲取預處理後的數據
* 訪問地址及參數:http://127.0.0.1:8090/test/getPreprocessedData?helloA.errorCode=1&helloA.message=a&helloA.data=a&helloB.errorCode=2&helloB.message=b&helloB.data=b
* 返回結果:dtoA:{"data":"a","errorCode":1,"message":"a"},dtoB:{"data":"b","errorCode":2,"message":"b"}
*/
@RequestMapping(value = "/getPreprocessedData")
public String getPreprocessedData(@ModelAttribute("helloA")ResponseDto dtoA,@ModelAttribute("helloB")ResponseDto dtoB){
return "dtoA:"+JSON.toJSONString(dtoA)+",dtoB:"+JSON.toJSONString(dtoB);
}
}