成功案例 品牌网站,互动网站建设多少钱,seo是什么意思揉若湖南岚鸿专注,空间设计手法有哪些在这个前后端分离的时代#xff0c;一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式#xff0c;不再出现服务器500的错误。
新建一个spring boot项目#xff0c;并导入knife4j的依赖。
写一个controller控制器#xff0c;用来是…在这个前后端分离的时代一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式不再出现服务器500的错误。
新建一个spring boot项目并导入knife4j的依赖。
写一个controller控制器用来是实现测试http的请求
RestController
public class TestController {GetMapping(/test)
public String test(){
int i1/0;return 一个test测试请求;
}
}
发送请求测试 异常的统一主要依赖于两个注解ControllerAdvice
Controller增强器给controller层增加统一的操作和处理
ExceptionHander
捕获controller抛出的异常并进行处理
自定义异常处理
1、自定义一个类Result用来实现返回给前端的统一格式
Data
AllArgsConstructor
NoArgsConstructor
public class ResultT implements Serializable {private static final long serialVersionUID 1L;
private Integer code;
private String message;
private T data;
}
2、创建一个类ResultException继承RuntimeException异常
Data
AllArgsConstructor
NoArgsConstructor
public class ResultException extends RuntimeException{private Integer code;private String message;
}3、创建一个VoResultException 类用来实现具体的逻辑
RestControllerAdvice
public class VoResultException {// 自定义异常处理类
ExceptionHandler(ResultException.class)
public Result errorResult(ResultException resultException){
return new Result(resultException.getCode(),resultException.getMessage(),null);
}}
RestControllerAdvice注解是ControllerAdvice和ResponseBody注解的结合标识返回的数据是json类型
至此我们就实现了全部的工作。现在在你想要抛出异常的地方直接使用即可直接抛出ResultException异常 GetMapping(/test)
public String test(){throw new ResultException(10001,测试异常);}
发送请求测试
可以返回了统一的数据但是这个异常是我们自定义的。所以不能处理程序中的错误
如下图这个错误
GetMapping(/test)
public String test(){int i1/0;throw new ResultException(10001,测试异常);}
测试请求
由于这个异常是在程序运行中出现的属于RunException异常我们自定义的异常不能够捕获到。 这时我们可以在自定义的异常处理器VoResultException类中再加入全局异常处理器。
如下所示
RestControllerAdvice
public class VoResultException {
// 自定义异常处理类
ExceptionHandler(ResultException.class)
public Result errorResult(ResultException resultException){
return new Result(resultException.getCode(),resultException.getMessage(),null);
}//全局异常处理类ExceptionHandler(Exception.class)public Result error(Exception e){return new Result(1001,e.getMessage(),null);}}
加入了全局异常处理时抛出的RunException异常就可以自动捕获了。
小插曲
ExceptionHandler(ResultException.class)注解里面是要捕获的异常的类型下面的方法参数中也一定要传入与这个类型一样的类队象 或者 满足继承关系这一点是非常重要的不然它不能自动捕获异常
因为有人还是搞不懂这个关系私下里问我。我再一次修改了这一次更加详细 在使用 ExceptionHandler 注解时注解中的类对象并不一定要与方法参数的对象类型完全一样但是要满足以下条件 类对象必须是方法参数对象的父类或接口。这意味着注解中的类对象可以是方法参数对象的超类、接口或实现类。 类对象不能是方法参数对象的子类。如果注解中的类对象是方法参数对象的子类那么该注解将不会匹配到该方法而是匹配到更具体的子类处理方法如果有定义。
我们再发一次请求 可以看到by zero这个异常被自动捕获了。
我们在正常的后端开发中也是这样搞得
一般我们定义两个ExceptionHandler。
一个是自定义异常用来在项目中抛出我们自定义的异常由于这个自定义的异常是继承RunException得来的所以不能处理项目在运行时的异常只能手动抛出也就是我们已经预先知道的异常
一个是全局异常用来捕获我们在项目中遇到的其他异常。可以这样说除了我们手动抛出的自定义异常其他的都需要全局异常来捕获并抛出。但是全局异常的表达并不能像我们自定义的异常一样清晰这个是虚拟机自动抛出的。