新聞中心
前言

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、石柱土家族ssl等。為超過(guò)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的石柱土家族網(wǎng)站制作公司
我們的項(xiàng)目通常來(lái)講都是一個(gè)比較大的項(xiàng)目,包含了各種各樣的服務(wù)。如果每個(gè)服務(wù)都以不同的方式返回異常信息,這樣排查的時(shí)候就會(huì)比較凌亂。如果我們定義一個(gè)標(biāo)準(zhǔn)的異常處理體系。并在所有的服務(wù)中使用。那樣開(kāi)發(fā)起來(lái)就可以快速定位。頁(yè)面也會(huì)更加的簡(jiǎn)單和直觀。
本文開(kāi)發(fā)環(huán)境基于springboot2.4,IDE環(huán)境是IDEA。這里從一個(gè)最簡(jiǎn)單的異常案例。逐步過(guò)渡到完全自定義自己的異常。
案例:Springboot查詢數(shù)據(jù)庫(kù)數(shù)據(jù),發(fā)現(xiàn)返回的是null,就拋出異常。
OK,基于這個(gè)思想,看一下實(shí)現(xiàn)的思路。
一、簡(jiǎn)單案例代碼實(shí)現(xiàn)
1、新建一個(gè)Springboot應(yīng)用
2、新建dao包,創(chuàng)建User類
這個(gè)比較簡(jiǎn)單,代碼如下:
- 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包,創(chuàng)建UserService
- @Service
- public class UserService {
- public User findOne(int id){
- //本來(lái)應(yīng)該向數(shù)據(jù)庫(kù)查詢User,但是數(shù)據(jù)庫(kù)沒(méi)有
- return null;
- }
- }
由于演示的是異常的案例,因此這里沒(méi)有真正實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查操作。當(dāng)調(diào)用findOne方法時(shí),直接返回為null即可。
4、新建controller包,創(chuàng)建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;
- }
- }
這里自定義了一個(gè)異常UserNotFoundException,當(dāng)數(shù)據(jù)庫(kù)查詢的時(shí)候一旦發(fā)現(xiàn)返回值為null,就直接拋出這個(gè)異常。
5、在controller包下,創(chuàng)建UserNotFoundException類
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException(String message){
- super(message);
- System.out.println("異常信息是:"+message);
- }
- }
6、postman測(cè)試
這時(shí)候進(jìn)行測(cè)試會(huì)發(fā)現(xiàn)服務(wù)器代碼會(huì)報(bào)錯(cuò)。我們的資源沒(méi)有找到總不能提示服務(wù)器內(nèi)部錯(cuò)誤吧。現(xiàn)在對(duì)拋出的異常進(jìn)行一個(gè)處理。
7、異常處理
- @ResponseStatus(HttpStatus.NOT_FOUND)
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException(String message){
- super(message);
- System.out.println("異常信息是:"+message);
- }
- }
我們將添加一個(gè)注釋@ResponseStatus來(lái)生成狀態(tài):404 Not Found。當(dāng)然還有其他的狀態(tài)。這個(gè)可以根據(jù)自己的需要去返回。我們使用了HttpStatus.NOT_FOUND用戶訪問(wèn)的時(shí)候,一旦拋出了異常就會(huì)顯示404錯(cuò)誤。這個(gè)你換成其他的狀態(tài),還會(huì)顯示其他的信息。
8、重新測(cè)試
Spring Boot和Spring MVC框架的結(jié)合提供了錯(cuò)誤處理。其內(nèi)部已經(jīng)自動(dòng)配置一些默認(rèn)異常處理。所以在開(kāi)發(fā)中為所有服務(wù)配置一致的異常消息是很重要的。
二、通用的異常處理
1、添加依賴
org.springframework spring-webmvc 5.3.2
2、創(chuàng)建異常返回實(shí)體類ExceptionResponse
這個(gè)類的作用是,當(dāng)有異常時(shí),我們想要展示的信息。
- 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;
- }
- }
這里只需要實(shí)現(xiàn)getter方法,setter方法就不需要。
3、創(chuàng)建通用異常處理類
- @ControllerAdvice
- @RestController
- public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
- //此方法主要處理所有的異常信息
- @ExceptionHandler(Exception.class)
- public final ResponseEntity
- //當(dāng)出現(xiàn)異常時(shí),我們輸出的信息,這里被封裝在了ExceptionResponse
- ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
- return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
- }
- //當(dāng)頁(yè)面資源沒(méi)有找到時(shí),拋出的異常
- @ExceptionHandler(UserNotFoundException.class)
- public final ResponseEntity
- ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
- return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
- }
- }
很簡(jiǎn)單。里面有很多API,可以自己根據(jù)需要去查即可。
4、postman測(cè)試
萬(wàn)事大吉。趕快為你的程序自定義一個(gè)通用的異常處理程序吧。
本文轉(zhuǎn)載自微信公眾號(hào)「愚公要移山」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系愚公要移山公眾號(hào)。
分享標(biāo)題:為你Springboot項(xiàng)目自定義一個(gè)通用的異常
網(wǎng)頁(yè)路徑:http://www.5511xx.com/article/dpscegc.html


咨詢
建站咨詢
