乐趣区

关于java:为你Springboot项目自定义一个通用的异常实用干货

本文出自公众号《愚公要移山》Springboot 系列

前言

咱们的我的项目通常来讲都是一个比拟大的我的项目,蕴含了各种各样的服务。如果每个服务都以不同的形式返回异样信息,这样排查的时候就会比拟凌乱。如果咱们定义一个规范的异样解决体系。并在所有的服务中应用。那样开发起来就能够疾速定位。页面也会更加的简略和直观。

本文开发环境基于 springboot2.4,IDE 环境是 IDEA。这里从一个最简略的异样案例。逐渐过渡到齐全自定义本人的异样。

案例:Springboot 查询数据库数据,发现返回的是 null,就抛出异样。

OK,基于这个思维,看一下实现的思路。

一、简略案例代码实现

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 测试

1609827005387

这时候进行测试会发现服务器代码会报错。咱们的资源没有找到总不能提醒服务器外部谬误吧。当初对抛出的异样进行一个解决。

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、从新测试

1609827261976

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 测试

1609828897996

高枕无忧。赶快为你的程序自定义一个通用的异样处理程序吧。

退出移动版