本文出自《Springboot》专题系列
我们的项目通常来讲都是一个比较大的项目,包含了各种各样的服务。如果每个服务都以不同的方式返回异常信息,这样排查的时候就会比较凌乱。如果我们定义一个标准的异常处理体系。并在所有的服务中使用。那样开发起来就可以快速定位。页面也会更加的简单和直观。
本文开发环境基于springboot2.4,IDE环境是IDEA。这里从一个最简单的异常案例。逐步过渡到完全自定义自己的异常。
案例:Springboot查询数据库数据,发现返回的是null,就抛出异常。
OK,基于这个思想,看一下实现的思路。
这个比较简单,代码如下:
public class User {
private int id;
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
//getter和setter方法
//toString方法
}
@Service
public class UserService {
public User findOne(int id){
//本来应该向数据库查询User,但是数据库没有
return null;
}
}
由于演示的是异常的案例,因此这里没有真正实现数据库的增删改查操作。当调用findOne方法时,直接返回为null即可。
@RestController
public class UserController {
@Autowired
private UserService service;
@GetMapping("/users/{id}")
public User retriveUser(@PathVariable int id)
throws UserNotFoundException {
User user= service.findOne(id);
if(user==null)
throw new UserNotFoundException("id: "+ id);
return user;
}
}
这里自定义了一个异常UserNotFoundException,当数据库查询的时候一旦发现返回值为null,就直接抛出这个异常。
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message){
super(message);
System.out.println("异常信息是:"+message);
}
}
这时候进行测试会发现服务器代码会报错。我们的资源没有找到总不能提示服务器内部错误吧。现在对抛出的异常进行一个处理。
@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message){
super(message);
System.out.println("异常信息是:"+message);
}
}
我们将添加一个注释@ResponseStatus来生成状态:404 Not Found。当然还有其他的状态。这个可以根据自己的需要去返回。我们使用了HttpStatus.NOT_FOUND用户访问的时候,一旦抛出了异常就会显示404错误。这个你换成其他的状态,还会显示其他的信息。
Spring Boot和Spring MVC框架的结合提供了错误处理。其内部已经自动配置一些默认异常处理。所以在开发中为所有服务配置一致的异常消息是很重要的。
org.springframework
spring-webmvc
5.3.2
这个类的作用是,当有异常时,我们想要展示的信息。
public class ExceptionResponse {
private Date timestamp;
private String message;
private String detail;
public ExceptionResponse() { }
public ExceptionResponse(Date timestamp, String message, String detail) {
this.timestamp = timestamp;
this.message = message;
this.detail = detail;
}
public Date getTimestamp() {
return timestamp;
}
public String getMessage() {
return message;
}
public String getDetail() {
return detail;
}
}
这里只需要实现getter方法,setter方法就不需要。
@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
//此方法主要处理所有的异常信息
@ExceptionHandler(Exception.class)
public final ResponseEntity
很简单。里面有很多API,可以自己根据需要去查即可。
万事大吉。赶快为你的程序自定义一个通用的异常处理程序吧。
点击“阅读原文”获取java相关5T资源,
视频,电子书,面试,简历,IDEA破解等