springboot 配置全局响应数据_SpringBoot全局统一异常处理

SpringBoot全局统一异常处理

空夜 • 2019 年 12 月 05 日

一、全局统一异常处理配置

先来看这样一个接口:@RestController

@RequestMapping(value = "")

public class IndexAction {

@GetMapping(value = "add")

public Integer add(Integer a, Integer b) {

return a+b;

}

}

思考:调用该接口时,如果a和b中,有一个为Null,会发生什么?

网页端:

这是一个非常讨人厌的情况:调用者如何处理这种未知状况呢?通过Http请求code来判定?

不如由被调用者来处理这种问题!

通过@ControllerAdvice和@ExceptionHandler,可以自定义对全部Controller接口的异常处理机制!@ControllerAdvice

public class ControllerHandler {

@ExceptionHandler

@ResponseBody

@ResponseStatus(HttpStatus.OK)

public JsonResult handleException(Exception ex) {

System.out.println("程序异常:" + ex.toString());

return new JsonResult(false, "请求失败");

}

}

重新测试:

上面我们定义了全局的异常处理,将所有异常的格式都统一了。

如果需要针对不同异常进行不同的处理呢?甚至对一个自定义的异常进行单独的处理呢?这是一个常见的请求。

二、自定义异常类型的配置

我们定义一个UserNotExistException异常,添加测试接口:@RestController

@RequestMapping(value = "")

public class IndexAction {

@GetMapping(value = "user/{id}")

public JsonResult findUser(@PathVariable Integer id) throws UserNotExistException {

if (id < 100) {

throw new UserNotExistException(id);

}

return new JsonResult(true, "暂未实现用户查询功能");

}

}

自定义的异常:public class UserNotExistException extends Exception {

private static final long serialVersionUID = -2373528888948315963L;

private Integer id;

public UserNotExistException(Integer id) {

this.id = id;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

@Override

public String toString() {

return "用户不存在";

}

}

未添加任何异常处理机制时,测试:

下面添加UserNotExistException异常的统一处理:@ControllerAdvice

public class ControllerHandler {

/**

* 处理全部异常

*/

@ExceptionHandler

@ResponseBody

@ResponseStatus(HttpStatus.OK)

public JsonResult handleException(Exception ex) {

System.out.println("程序异常:" + ex.toString());

return new JsonResult(false, "请求失败");

}

/**

* 处理UserNotExistException异常

*/

@ExceptionHandler({UserNotExistException.class})

@ResponseBody

@ResponseStatus(HttpStatus.OK)

public JsonResult handleUserNotExistException(UserNotExistException ex) {

System.out.println("请求用户数据异常:" + ex.toString());

return new JsonResult(false, "请求用户数据失败");

}

}

测试:

再测试一下之前空指针异常:

经过测试,被要求单独处理的异常会先被处理,而后其他异常会被Exception(默认形式)的处理方法捕获。

你可能感兴趣的:(springboot,配置全局响应数据)