为你Springboot项目自定义一个通用的异常(实用干货)

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

前言

咱们的项目一般来说都是一个比较大的项目,包含了各类各样的服务。若是每一个服务都以不一样的方式返回异常信息,这样排查的时候就会比较凌乱。若是咱们定义一个标准的异常处理体系。并在全部的服务中使用。那样开发起来就能够快速定位。页面也会更加的简单和直观。web

本文开发环境基于springboot2.4,IDE环境是IDEA。这里从一个最简单的异常案例。逐步过渡到彻底自定义本身的异常。spring

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

OK,基于这个思想,看一下实现的思路。数据库

1、简单案例代码实现

一、新建一个Springboot应用

二、新建dao包,建立User类

这个比较简单,代码以下:springboot

`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包,建立UserService

`@Service
public class UserService {
    public User findOne(int id){
        //原本应该向数据库查询User,可是数据库没有
        return null;
    }
}
`mvc

因为演示的是异常的案例,所以这里没有真正实现数据库的增删改查操做。当调用findOne方法时,直接返回为null便可。app

四、新建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,就直接抛出这个异常。post

五、在controller包下,建立UserNotFoundException类

`public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message){
        super(message);
        System.out.println("异常信息是:"+message);
    }
}
`测试

六、postman测试

1609827005387

1609827005387

这时候进行测试会发现服务器代码会报错。咱们的资源没有找到总不能提示服务器内部错误吧。如今对抛出的异常进行一个处理。

七、异常处理

`@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错误。这个你换成其余的状态,还会显示其余的信息。

八、从新测试

1609827261976

1609827261976

Spring Boot和Spring MVC框架的结合提供了错误处理。其内部已经自动配置一些默认异常处理。因此在开发中为全部服务配置一致的异常消息是很重要的。

2、通用的异常处理

一、添加依赖

`<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.2</version>
</dependency>
`

二、建立异常返回实体类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方法就不须要。

三、建立通用异常处理类

`@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,能够本身根据须要去查便可。

四、postman测试

1609828897996

1609828897996

万事大吉。赶快为你的程序自定义一个通用的异常处理程序吧。

相关文章
相关标签/搜索