導航欄
- 正文
- 撰寫啟動類及組態檔
- 啟動類
- 組態檔
- 啟動測驗
- 搭建專案的基本框架
- 統一請求回傳體(統一請求回應體)
- CommonResult
- 約定狀態碼
- 分頁結果類
- 全域例外處理類
- GlobalException
正文
上回我們已經將專案創建好并且引入了本次專案所需要用到的依賴,這次我們就正式進入專案的撰寫
撰寫啟動類及組態檔
啟動類
在java檔案夾下新建兩級目錄并創建MainApplication.class


按照上述步驟創建并撰寫完啟動類后就可以開始組態檔的創建了,
組態檔
在resources目錄下創建application.yml作為SpringBoot的組態檔
server:
port: 8090 #監聽埠為8090
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource #配置資料庫連接池為Druid
driver-class-name: com.mysql.cj.jdbc.Driver #配置資料庫
username: 資料庫用戶名
password: 資料庫登錄密碼
url: jdbc:mysql://127.0.0.1:3306/資料庫名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
請注意對齊,以免發生錯誤,
啟動測驗
完成上述兩個步驟后一個最簡易的SpringBoot專案就搭建完成了!這時我們右鍵主啟動類直接啟動專案看見如下圖所示,就已經成功在8090埠啟動了我們的SpringBoot專案了

搭建專案的基本框架
在完成啟動測驗之后我們將整個專案停止,并繼續完善我們專案的骨架,熟悉JavaEE的同學都知道在一個JavaWeb專案中主要有下圖所示的幾個包

注意:請將這些包與主啟動類平級創建,以免后面SpringBoot無法掃描到相應的包,
不同包的作用就不在此贅述,接下來我們將從統一請求回傳體開始進行專案的撰寫,
統一請求回傳體(統一請求回應體)
目前Web專案一般是采用前后端分離的架構,使用Json格式資料作為前后端溝通的橋梁,那么我們在每次回應請求時都需要回傳一個Json格式的資料給前端,如果每次手動拼接資料會產生很多冗余代碼于是我們利用一個統一的回傳物件對回傳格式進行統一,在model包下新建bean包并創建CommonResult類,類中的代碼如下
CommonResult
/**
* @author Alfalfa99
* @Date 2020/9/13 14:00
* @Version 1.0
* 統一請求回傳體
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
private Integer code;
private String message;
private T data;
}
為了減少重復的get/set方法,我們使用了Lombok中的 @Data @AllArgsConstructor @NoArgsConstructor三個注解幫助我們自動生成get/set方法以及全參/無參構造方法,
注意:如果適用的舊版的idea請注意升級到較新版本的idea,以免idea中的Lombok插件過久出錯,如果是第一次使用Lombok請前往idea中的插件市場搜索并下載Lombok插件,以免運行時出錯,
那么我們的統一請求回傳體就已經撰寫完畢了,類中有三個欄位
Code:用于向前端回傳約定好的狀態碼message:用于向前端回傳一個訊息data:用于向前端回傳真正需要的資料
接下來我們需要做兩件事情,一件事情是約定好狀態碼,另一件事情是撰寫分頁結果類,
約定狀態碼
通常而言HTTP請求有常用狀態碼如200 OK,404 Not Found 等錯誤,但是這在開發中常常不足以滿足我們的全部需求,于是我們需要自定義所需的狀態碼
20000:表示一切正常40000-4xxxx:表示程式出現如用戶未登錄等問題50000:表示程式出現預料外的錯誤,這時候應該記錄到服務器日志
這部分內容將會在后面的全域例外處理類中詳細講述,
分頁結果類
在上文中我們說到了統一請求回傳體CommonResult ,但是在實際撰寫代碼時我們會遇到一些問題,比如說對搜索結果進行分頁,前端就要求我們回傳結果總數和分頁的數量以及當前頁的結果,那這個時候我們只使用一個data欄位是無法完成這樣的需求的,所以我們需要將其封裝成一個分頁結果類PageResult,在bean包中新建PageResult類,類中代碼如下
/**
* @Author Alfalfa99
* @Date 2020/9/17 11:02
* @Version 1.0
* 分頁回傳類
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult <T> {
private long pages;
private long total;
private List<T> rows;
}
在分頁結果類中我們同樣使用了Lombok,在這里就不在贅述了,我們將分頁數,結果總數以及當前頁的資料作為欄位在查詢出結果之后先包裝到PageResult中再將PageResult包裝到上文所述的CommonResult中,由此我們的分頁結果類就完成了,
全域例外處理類
在一個Web專案運行時總會出現各種各樣的例外,出現例外時我們應該根據例外的等級對其進行日志記錄,常用的工具有log4j,slf4j等,在本專案中就不對日志記錄進行詳細的講解也不去進行錯誤的記錄,僅將其拋出到前端并由前端對用戶進行展示,
言歸正傳,在初學JavaSE時出現了例外我們常常將其列印到控制臺,但是在Web專案中如果直接將錯誤資訊輸出到用戶瀏覽器將是非常不明智且不美觀的,由此我們利用Spring框架中自帶的一個注解@RestControllerAdvice進行全域例外的處理,
GlobalException
首先我們在與主啟動類同級的目錄下創建一個新的包exception,并在包中創建一個名為GlobalException的全域例外處理類,

類中的內容為:
/**
* @Author Alfalfa99
* @Date 2020/9/13 13:59
* @Version 1.0
* 全域例外處理類
*/
@RestControllerAdvice
public class GlobalException {
/**
* 捕獲所有(Exception.class)中的例外并通過下面的方法回傳
*
* @param e 錯誤型別
* @return 給前端回傳報錯資訊
*/
@ExceptionHandler(value = Exception.class)
public CommonResult<String> toHandlerException(Exception e) {
//開發模式下將錯誤資訊列印到控制臺便與除錯
e.printStackTrace();
if (e instanceof MethodArgumentNotValidException) {
//引數驗證錯誤
return new CommonResult<>(40001, "Error", "引數驗證錯誤");
} else if (e instanceof HttpRequestMethodNotSupportedException) {
//請求方法有誤
return new CommonResult<>(40002, "ERROR", "錯誤的請求方法");
} else if (e instanceof HttpMessageNotReadableException) {
//請求體錯誤
return new CommonResult<>(40003, "ERROR", "錯誤的請求體");
} else if (e instanceof IllegalArgumentException) {
//錯誤的引數
return new CommonResult<>(40004, "ERROR", "錯誤的請求引數");
} else if (e instanceof AccessDeniedException) {
//用戶權限不足
return new CommonResult<>(40005, "Error", e.getMessage());
} else if (e instanceof BadCredentialsException) {
//Token令牌過期
return new CommonResult<>(40010, "Error", e.getMessage());
} else if (e instanceof InternalAuthenticationServiceException) {
//用戶名或密碼錯誤
return new CommonResult<>(40011, "Error", e.getMessage());
} else if (e instanceof DisabledException) {
//賬號被封禁
return new CommonResult<>(40012, "Error", e.getMessage());
} else if (e instanceof AuthenticationCredentialsNotFoundException) {
//用戶未登錄
return new CommonResult<>(40013, "Error", e.getMessage());
} else if (e instanceof DuplicateKeyException) {
//用戶名重復
return new CommonResult<>(40014, "ERROR", e.getMessage());
} else {
return new CommonResult<>(50000, "Error", "你觸發了一個未知錯誤!");
}
}
}
從代碼可以看到我們利用了@RestControllerAdvice注解注冊了一個全域例外類,使用@ExceptionHandler注解捕獲一個特定種類的錯誤,方便起見這里直接捕獲的是Exception.class,在你的專案中你可以個性化的捕獲不同的例外執行不同的操作,該類的內容比較簡單易懂,不去啰嗦,那么專案的基本框架我們已經搭建完成了,在下一篇博客我們將會進入到model的撰寫和利用jwt進行權限的驗證,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/110484.html
標籤:其他
下一篇:天津大學仁愛學院ACM作業室簡介
