全局异常处理
用@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);
}
}