java⾃定义异常返回_spring-boot⾃定义异常返回
上⽂测试开发专题:spring-boot统⼀异常捕获我们讨论了java异常以及如何使⽤Spring-Boot捕获异常,但是没有去说捕获异常后该如何进⼀步处理,这篇⽂章我们将对这个遗留的问题进⾏讨论.
统⼀错误响应定义
我们希望在程序发⽣异常的时候,能够给⽤户返回⼀个⽐较友好且明确的信息,对于api接⼝来说,⼀种⽐较好的格式是json,类似于下⾯这种格式
{
"code": "10001",
"message": "消息",
"uri":"Get /v2/banner"
}
所以需要⼀个对象来描述这种数据格式:
public class UnifyResponse {
private int code;
private String message;
private String requestUri;
public UnifyResponse(int code, String message, String requestUri){
}
}
错误响应处理
上⽂我们谈到从开发者的⾓度来说,异常分为已知异常和未知异常,针对不同的异常使⽤不同的异常处理函数进⾏处理,我们之前定义两个处理函数
@ControllerAdvice
public class GlobalExceptionAdvice {
/**
* 处理未知异常
* @param req
* @param ex
*/
@ExceptionHandler(value = Exception.class)
public void handleHttpException(HttpServletRequest req, Exception ex){
System.out.println("发⽣异常了");
}
/**
* 处理已知异常
* @param req
* @param ex
*/
@ExceptionHandler(value = HttpException.class)
public void handleHttpException(HttpServletRequest req, HttpException ex){
System.out.println("发⽣了 HttpException");
}
}
当未知异常发⽣时,需要将异常信息存储进 UnifyResponse,序列化后返回给⽤户
@ExceptionHandler(value = Exception.class)
public UnifyResponse handleHttpException(HttpServletRequest req, Exception ex){
String uri = RequestURI();
String method = Method();
System.out.Message());
return new UnifyResponse(9999, "服务器错误", method + " " + uri);
}
对于未知异常我们也不知道发⽣了什么,所以这⾥的code码就定义⼀个通⽤的,虽然Exception⾥⾯有message,但是这⾥不建议将这个异常⾥的message返回给⽤户,这位可能涉及到代码结构的⼀些东西,⽽且即使将这个信息返回给前端,他也不知道是啥问题,没什么意义,所以可以将这个message写到⽇志⾥,⽅便后⾯问题查询。
返回给⽤户的message可以⾃定义⼀个通⽤的,⽐如服务器错误什么的。
我们来测试⼀下,在Controller⾥抛出⼀个Exception:
@RequestMapping(value = "/v2/banner", method = {RequestMethod.GET})
public String test() throws Exception{
throw new Exception("我抛出来的");
}
然后再浏览器⾥访问,发现出错了
这⾥的这个异常,看不太懂,回到异常处理⽅法当中去,我们直接是返回UnifyResponse对象,如果这⾥返回的是⼀个字符串,那会不会出错呢,再是试⼀下看看,结果还是会报这个错,也就是说⽆论这⾥返回⾃定义对象还是字符串,都会出现问题,那就是说spring-boot压根⼉就可能不识别我们返回的东西。
在spring-boot⾥有⼀个注解@ResponseBody,可以将我们的返回值,绑定的响应的body上,我们来试⼀下看看能否解决这个问题。
会发现,上⾯改的返回String是可以成功的,但是返回UnifyResponse对象还是报错,⽽且报错和之前的还不⼀样
刚才报的还是404的错误,现在变成了500,哪⾥错了呢。
我们来看⼀下UnifyResponse的定义,我们定义了三个私有的成员变量,但是确没有定义getter⽅法,那在序列化的时候是⽆法获取到成
员变量的值的,所以报错,这⾥我们加上:
然后在运⾏程序,访问路由:
返回的响应就和我们预期的⼀样了,但是从上⾯的图中,看到返回的状态码是200,这显然是不对的,因为服务器已经出错了,状态码应该是500,所以这⾥要对状态码进⾏⾃定义。
⾃定义状态码
spring-boot提供了两种可以⾃定义状态码的⽅式:
注解
直接在异常处理函数上标记⼀个叫做
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)并制定状态码的枚举值
重启程序,访问路由:
springboot是啥可以看到状态码已经变成500了。
上⾯使⽤注解的的形式虽然能够实现我们的⽬的,但是这种⽅式不太灵活,,这⾥很多的response的设置都是spring-boot帮我们做了,如果需要做⼀些⾃定义就不是太⽅便,接下来的这种⽅式确可以让我们通过代码灵活的进⾏控制。
ResponseEntity
ResponseEntity是⼀个泛型类,是可以直接return回去的,可以设置很多属性,包括status、headers、body等。
⽤ResponseEntity来⾃定义已知异常处理⽅法的返回信息:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论