统一异常处理@ControllerAdvice+@ExceptionHandler
本文章向大家介绍统一异常处理@ControllerAdvice+@ExceptionHandler,主要包括统一异常处理@ControllerAdvice+@ExceptionHandler使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
统一异常处理
一、对异常的处理使用统一的异常处理流程:
1、自定义异常类型。
2、自定义错误代码及错误信息。
3、对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较 齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
4、对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。 不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为 RuntimeException类型(运行时异常)。
5、可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随请求响应给客户端。
二、抛出及处理流程:
1、在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型
2、统一由异常捕获类捕获异常,并进行处理 。
3、获到自定义异常则直接取出错误代码及错误信息,响应给用户。
4、捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误 信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。
5、将错误代码及错误信息以Json格式响应给用户。
三、可预知异常处理
1.自定义异常捕获类
import java.util.HashMap;
import java.util.Map;
import org.hibernate.criterion.NullExpression;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> exception(Exception e){
e.printStackTrace();
Map<String, Object> map =new HashMap<String, Object>();
map.put("code", "500");
map.put("msg", "run time exception");
return map;
}
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public Map<String, Object> exception2(Exception e){
e.printStackTrace();
Map<String, Object> map =new HashMap<String, Object>();
map.put("code", "500");
map.put("msg", "空指针异常");
return map;
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.myspringboot.service.UsersServices;
@RestController
public class UserController2 {
@Autowired
private UsersServices usersServices;
@RequestMapping("/select2") //
@ResponseBody
public Object select(Integer id) {
return this.usersServices.select(id);
}
@RequestMapping("/e1") //
@ResponseBody
public Object e1() {
int a =1/0;
return "hello e1";
}
@RequestMapping("/e2") //
@ResponseBody
public Object e2() {
String a =null;
a.substring(1);
return "hello e2";
}
}
其他参考文案
统一异常处理@ControllerAdvice+@ExceptionHandler - 码农教程
SpringBoot拦截器的使用
1.自定义拦截器,并重写方法
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("开始拦截。。。。。。");
String token = (String)request.getHeader("token");
if(token==null||token=="") {
response.getWriter().print("Meiyou token");
return false;
}
return true;
}
}
import com.myspringboot.aop.LoginInterceptor;
@Configuration //bean xml文件
public class WebConfig {
@Autowired
private LoginInterceptor loginInterceptor;
@Bean
public WebMvcConfigurer config() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor);
}
}
}
网址输入:
http://127.0.0.1:8080/name
因为header没有携带Token,所以被拦截,并显示代码中的文本