一、简单案例代码实现
1、新建一个Springboot应用
2、新建dao包,创建User类
这个比较简单,代码如下:
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方法 }
3、新建service包,创建UserService
@Service public class UserService { public User findOne(int id){ //本来应该向数据库查询User,但是数据库没有 return null; } }
由于演示的是异常的案例,因此这里没有真正实现数据库的增删改查操作。当调用findOne方法时,直接返回为null即可。
4、新建controller包,创建UserController类
@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,就直接抛出这个异常。
5、在controller包下,创建UserNotFoundException类
public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message){ super(message); System.out.println("异常信息是:"+message); } }
6、postman测试
这时候进行测试会发现服务器代码会报错。我们的资源没有找到总不能提示服务器内部错误吧。现在对抛出的异常进行一个处理。
7、异常处理
@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错误。这个你换成其他的状态,还会显示其他的信息。
8、重新测试
Spring Boot和Spring MVC框架的结合提供了错误处理。其内部已经自动配置一些默认异常处理。所以在开发中为所有服务配置一致的异常消息是很重要的。
二、通用的异常处理
1、添加依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.2</version> </dependency>
2、创建异常返回实体类ExceptionResponse
这个类的作用是,当有异常时,我们想要展示的信息。
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方法就不需要。
3、创建通用异常处理类
@ControllerAdvice @RestController public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { //此方法主要处理所有的异常信息 @ExceptionHandler(Exception.class) public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) { //当出现异常时,我们输出的信息,这里被封装在了ExceptionResponse ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false)); return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR); } //当页面资源没有找到时,抛出的异常 @ExceptionHandler(UserNotFoundException.class) public final ResponseEntity<Object> handleUserNotFoundExceptions(UserNotFoundException ex, WebRequest request) { ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false)); return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND); } }
很简单。里面有很多API,可以自己根据需要去查即可。
4、postman测试
万事大吉。赶快为你的程序自定义一个通用的异常处理程序吧。