1. 使用 @ControllerAdvice和@ExceptionHandler处理全局异常

1. 新建异常信息实体类

非必要的类,主要用于包装异常信息。

 package com.test.exception.myexception;

 public class ErrorResponse {
private String message;
private String errorTypeName; public ErrorResponse(Exception e) {
this(e.getClass().getName(), e.getMessage());
} public ErrorResponse(String errorTypeName, String message) {
this.errorTypeName = errorTypeName;
this.message = message;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public String getErrorTypeName() {
return errorTypeName;
} public void setErrorTypeName(String errorTypeName) {
this.errorTypeName = errorTypeName;
}
}

2. 自定义异常类型

package com.test.exception.myexception;

public class ReourceNotFoundException extends RuntimeException {
private String message; public ReourceNotFoundException() {
super();
} public ReourceNotFoundException(String message) {
super(message);
this.message = message;
} @Override
public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}

3. 新建异常处理类

我们只需要在类上加上@ControllerAdvice注解这个类就成为了全局异常处理类,当然你也可以通过 assignableTypes指定特定的 Controller类,让异常处理类只处理特定类抛出的异常。

 package com.test.exception.handler;

 import com.test.exception.myexception.ErrorResponse;
import com.test.exception.myexception.ReourceNotFoundException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException; @ControllerAdvice(assignableTypes = {com.test.exception.controller.ExceptionController.class})
@ResponseBody
public class GlobalExceptionHandler {
ErrorResponse illegalArgumentResponse = new ErrorResponse(new IllegalArgumentException("参数错误!"));
ErrorResponse resourseNotFoundResponse = new ErrorResponse(new com.test.exception.myexception.ReourceNotFoundException("Sorry, the resourse not found!")); @ExceptionHandler(value = Exception.class)// 拦截所有异常, 这里只是为了演示,一般情况下一个方法特定处理一种异常
public ResponseEntity<ErrorResponse> exceptionHandler(Exception e) { if (e instanceof IllegalArgumentException) {
return ResponseEntity.status(400).body(illegalArgumentResponse);
} else if (e instanceof ReourceNotFoundException) {
return ResponseEntity.status(404).body(resourseNotFoundResponse);
}else if(e instanceof ResponseStatusException){
return ResponseEntity.status(502).body(resourseNotFoundResponse);
}
return null;
}
}

4. controller模拟抛出异常

 package com.test.exception.controller;

 import com.test.exception.myexception.ReourceNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException; @RestController
public class ExceptionController { @GetMapping("/illegalArgumentException")
public void throwException() {
throw new IllegalArgumentException();
} @GetMapping("/resourceNotFoundException")
public void throwException2() {
throw new ReourceNotFoundException(); } @GetMapping("/resourceNotFoundException2")
public void throwException3() {
throw new ResponseStatusException(HttpStatus.BAD_GATEWAY,"The resource not found",new ReourceNotFoundException());
}
}

使用 Get 请求: http://localhost:8080/resourceNotFoundException

{"message":"Sorry, the resourse not found!","errorTypeName":"com.test.exception.myexception.ReourceNotFoundException"}

3. ResponseStatusException

研究 ResponseStatusException 我们先来看看,通过 ResponseStatus注解简单处理异常的方法(将异常映射为状态码)。

package com.test.exception.myexception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.BAD_GATEWAY)
public class ReourceNotFoundException2 extends RuntimeException {
public ReourceNotFoundException2() {
} public ReourceNotFoundException2(String message) {
super(message);
}
}

这种通过 ResponseStatus注解简单处理异常的方法是的好处是比较简单,但是一般我们不会这样做,通过ResponseStatusException会更加方便,可以避免我们额外的异常类。

    @GetMapping("/resourceNotFoundException2")
public void throwException3() {
throw new ResponseStatusException(HttpStatus.BAD_GATEWAY,"The resource not found",new ReourceNotFoundException());
}

ResponseStatusException 提供了三个构造方法:

    public ResponseStatusException(HttpStatus status) {
this(status, null, null);
} public ResponseStatusException(HttpStatus status, @Nullable String reason) {
this(status, reason, null);
} public ResponseStatusException(HttpStatus status, @Nullable String reason, @Nullable Throwable cause) {
super(null, cause);
Assert.notNull(status, "HttpStatus is required");
this.status = status;
this.reason = reason;
}

构造函数中的参数解释如下:

  • status : http status
  • reason :response 的消息内容
  • cause : 抛出的异常

@ControllerAdvice和@ExceptionHandler的更多相关文章

  1. @ControllerAdvice 和 @ExceptionHandler

    @ExceptionHandler的作用是把对不同异常处理抽取到不同的方法中. @ControllerAdvice的作用是把控制器中 @ExceptionHandler.@InitBinder.@Mo ...

  2. springmvc 全局的异常拦截处理 @ControllerAdvice注解 @ExceptionHandler

    第一步: Dispatcher前端控制器的源码中 默认的 private boolean throwExceptionIfNoHandlerFound = false;说明如果没有找到匹配的执行器,不 ...

  3. @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常

    @ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHandler, 方法注解, 作用于 Controller 级别. ExceptionHandle ...

  4. Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。

    通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法: controller中加入@Valid注解: @Req ...

  5. 统一异常处理@ControllerAdvice

    一.异常处理 有异常就必须处理,通常会在方法后面throws异常,或者是在方法内部进行try catch处理. 直接throws Exception 直接throws Exception,抛的异常太过 ...

  6. 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理

    1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...

  7. SpringBoot RESTful 应用中的异常处理小结

    转载:https://segmentfault.com/a/1190000006749441 @ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHa ...

  8. 详细解说Java Spring的JavaConfig注解 【抄】

    抄自: http://www.techweb.com.cn/network/system/2016-01-05/2252188.shtml @RestController spring4为了更方便的支 ...

  9. Java Spring的 JavaConfig 注解

    序 传统spring一般都是基于xml配置的,不过后来新增了许多JavaConfig的注解.特别是springboot,基本都是清一色的java config,不了解一下,还真是不适应.这里备注一下. ...

随机推荐

  1. Luogu P4082 [USACO17DEC]Push a Box 点双连通分量/圆方树

    (貌似有圆方树的做法,我写的是点双) 显然这道题就是直接搜索.定义状态为f[i][j][0~4]表示箱子在(i,j),人在某个方向推.然后问题就是怎么转向.我们发现如果要转向,必须是人走过一条不包括( ...

  2. [Google Guava] 4-函数式编程

    原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提 ...

  3. 网络_05 STP HSRP

    一.案例1:STP的基本配置 将S1配置成vlan1的主根,将S2配置成vlan2的次根 查看生成树的配置:show spanning-tree 查看某个vlan生成树的详细信息:show spann ...

  4. 51nod 1677

    考虑树上的每条边对答案的贡献--- x ----y ---若 x 左边有 a2 个点,y 的右边有 a3 个点那么改边对答案的贡献为 C(n, k) - C(a2, k) - C(a3, k)快速幂求 ...

  5. 二十五、grub (Boot Loader) 以及修复grub

    双系统安装(先Windows后Linux,以免windows NTloader会覆盖Linux loader) GRUB Grand Uniform Bootloader CentOS5,6 grub ...

  6. 十二、 RAID

    https://blog.51cto.com/sonlich http://note.youdao.com/noteshare?id=17083150f38dd19343f82ea6cc0e0e62& ...

  7. table表格整体居中

    代码: <div style="text-align:center"> <table border="1" cellpadding=" ...

  8. python中的匿名函数

    python 使用 lambda 来创建匿名函数. 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数. lambda 只是一个表达式,函数体比 def 简单很多. lambda的主体是一 ...

  9. 启动Docker后台容器,测试运行Hello-world

    1.使用docker run hello-world命令运行测试hello-world镜像,如下: 2.run 命令都干了什么?如下图: 3.为什么Docker比vm快?

  10. Leetcode题目338:比特位计数(中等)

    题目描述: 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例  ...