1、統一資料回傳
使用逆向工程來進行測驗,物體,mapper等省略;
1.1 直接使用 RequestResoult
1.1.1 RequestResoult 請求結果回傳物體
//統一回傳 物體 類
@Data
public class RequestResult<T> {
//狀態碼
private String code;
//狀態說明,對code的說明
private String msg;
//介面資料
private T data;
}
1.1.2 service層
1.1.2.1 介面
public interface EdocEntryService {
//按摘要查詢
List<EdocEntry> getEdocEntriesBySummary(String summary);
}
1.1.2.2 實作類
注意記得在 主啟動類中添加 mapper介面掃描注解 :@MapperScan("com.kgc.sbt.mapper")
@Service
public class EdocEntryServiceImpl implements EdocEntryService {
@Autowired(required = false)
private EdocEntryMapper edocEntryMapper;
@Override
public List<EdocEntry> getEdocEntriesBySummary(String summary) {
//使用逆向工程,封裝查詢條件
EdocEntryExample edocEntryExample = new EdocEntryExample();
//排序條件
edocEntryExample.setOrderByClause(" id desc ");
//根據摘要 模糊查詢
edocEntryExample.createCriteria().andSummaryLike("%" + summary + "%");
//呼叫持久層 查詢資料
return edocEntryMapper.selectByExample(edocEntryExample);
}
}
1.1.3 測驗請求
@Slf4j
@RestController
public class EdocEntryController {
@Autowired
private EdocEntryService edocEntrieService;
//根據電子檔案,查詢檔案串列,直接使用 RequestResult
@GetMapping("/edocEntries")
//指定請求回傳型別 RequestResult<List<EdocEntry>>
//public RequestResult<List<EdocEntry>> edocEntries(@RequestParam(required = false) String summary){
//自適應請求回傳型別 RequestResult<?>
public RequestResult<?> edocEntries(@RequestParam(required = false) String summary){
//呼叫業務介面,獲取檔案串列,進行統一回傳
//創建統一回傳物件
//每次都需要創建回傳物件,代碼冗余,不利于維護
RequestResult<List<EdocEntry>> requestResult = new RequestResult<>();
requestResult.setCode("200");
requestResult.setMsg("success");
List<EdocEntry> edocEntriesBySummary = edocEntrieService.getEdocEntriesBySummary(summary);
log.info("{}",edocEntriesBySummary);
requestResult.setData(edocEntriesBySummary);
//介面統一回傳查詢結果
return requestResult;
}
}
測驗結果:

1.2 使用 ResultBuildUtil 結果物件構建工具
1.2.1 CommonConstant 常量類
//Description: 系統常量類,統一管理專案中所有的常量
public class CommonConstant {
/*
統一回傳成功的狀態碼
*/
public static final String UNIFY_RESULT_SUCCESS_CODE = "200";
/*
統一回傳成功的資訊
*/
public static final String UNIFY_RESULT_SUCCESS_MSG = "SUCCESS";
/*
統一回傳錯誤的狀態碼
*/
public static final String UNIFY_RESULT_FAIL_CODE = "999";
/*
統一回傳錯誤的資訊
*/
public static final String UNIFY_RESULT_FAIL_MSG = "FAIL";
/*
分頁默認頁嗎
*/
public static final int DEFAULT_INIT_PAGE_NO = 1;
/*
分頁默認條數
*/
public static final int DEFAULT_INIT_PAGE_SIZE = 3;
}
1.2.2 ResultBuildUtil結果物件構建工具列
//Description: 結果構建工具類
public class ResultBuildUtil {
//構建成功回傳,支持任意型別引數
public static <T> RequestResult<T> success(T t) {
//創建統一回傳成功結果物件
RequestResult<T> requestResult = new RequestResult<>();
requestResult.setCode(CommonConstant.UNIFY_RESULT_SUCCESS_CODE);
requestResult.setMsg(CommonConstant.UNIFY_RESULT_SUCCESS_MSG);
requestResult.setData(t);
return requestResult;
}
//構建成功回傳,空參
public static <T> RequestResult<T> success() {
return success(null);
}
//構建 失敗回傳,支持任意型別引數,用戶不便于歸類的例外錯誤結果回傳
public static <T> RequestResult<T> fail(T t) {
//創建統一回傳失敗結果物件
RequestResult<T> requestResult = new RequestResult<>();
requestResult.setCode(CommonConstant.UNIFY_RESULT_FAIL_CODE);
requestResult.setMsg(CommonConstant.UNIFY_RESULT_FAIL_MSG);
requestResult.setData(t);
return requestResult;
}
//構建 失敗回傳,空參
public static <T> RequestResult<T> fail() {
//創建統一回傳失敗結果物件
return fail(null);
}
//構建 失敗回傳,自定義錯誤碼,和說明,支持任意型別引數
public static <T> RequestResult<T> fail(String errCode,String errMsg,T t) {
//創建統一回傳失敗結果物件
RequestResult<T> requestResult = new RequestResult<>();
requestResult.setCode(errCode);
requestResult.setMsg(errMsg);
requestResult.setData(t);
return requestResult;
}
//構建 失敗回傳,自定義錯誤碼,和說明,無參
public static <T> RequestResult<T> fail(String errCode,String errMsg) {
//創建統一回傳 失敗結果物件
RequestResult<T> requestResult = new RequestResult<>();
requestResult.setCode(errCode);
requestResult.setMsg(errMsg);
return requestResult;
}
}
1.2.3 service層
service層不變;
1.2.4 請求測驗
@Slf4j
@RestController
public class EdocEntryController {
@Autowired
private EdocEntryService edocEntrieService;
//根據電子檔案,查詢檔案串列, 使用結果構建工具
@GetMapping("/edocEntries")
public RequestResult<?> edocEntries(@RequestParam(required = false) String summary){
//使用結果構建工具,回傳成功的結果
return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary));
}
}
測驗結果:

2、統一分頁工具
2.1 PageSupport 統一分頁工具類
// 分頁 結果回傳類
@Data
public class PageSupport<T> {
//當前頁碼
private int pageNo;
//頁面條數
private int pageSize;
//總條數
private int totalCount;
//總頁數
private int totalPage;
//分頁資料
private Collection<T> PageData;
//當總條數確定時,總條數確定
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
totalPage = totalCount % this.pageSize == 0
? totalCount / this.pageSize
: totalCount / this.pageSize + 1;
}
}
2.2 service 層
2.2.1 介面
public interface EdocEntryService {
//條件分頁查詢
PageSupport<EdocEntry> getEdocEntriesBySummary(String summary,Integer pageNo,Integer pageSize);
}
2.2.2 實作類
@Service
public class EdocEntryServiceImpl implements EdocEntryService {
@Override
public PageSupport<EdocEntry> getEdocEntriesBySummary(String summary, Integer pageNo, Integer pageSize) {
//創建統一回傳分頁物件
PageSupport<EdocEntry> pageSupport = new PageSupport<>();
//設定分頁引數
pageSupport.setPageNo(pageNo < 1 ? CommonConstant.DEFAULT_INIT_PAGE_NO : pageNo);
pageSupport.setPageSize(pageNo < 3 ? CommonConstant.DEFAULT_INIT_PAGE_SIZE : pageSize);
//封裝查詢條件
EdocEntryExample edocEntryExample = new EdocEntryExample();
//排序條件
edocEntryExample.setOrderByClause(" id desc ");
//根據摘要 模糊查詢
edocEntryExample.createCriteria().andSummaryLike("%" + summary + "%");
// 查詢滿足條件總條數
pageSupport.setTotalCount((int) edocEntryMapper.countByExample(edocEntryExample));
//增加分頁引數
edocEntryExample.setOffset((long)(pageSupport.getPageNo()-1)*pageSupport.getPageSize());
edocEntryExample.setLimit(pageSupport.getPageSize());
//增加分頁資料
pageSupport.setPageData(edocEntryMapper.selectByExample(edocEntryExample));
//回傳分頁物件
return pageSupport;
}
}
2.3 commons-lang中 isEmpty 方法和idBlank區別
2.3.1 依賴
<!-- commons-lang start -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- commons-lang end -->
2.3.2 isEmpty 方法和idBlank區別
isEmpty 和 isBlank ,isEmpty 方法和idBlank區別:只包含空格字串判斷,isEmpty是false,isBlank是true;
2.3.2.1 isEmpty
* <pre>
* StringUtils.isEmpty(null) = true
* StringUtils.isEmpty("") = true
* StringUtils.isEmpty(" ") = false
* StringUtils.isEmpty("bob") = false
* StringUtils.isEmpty(" bob ") = false
* </pre>
2.3.2.2 isBlank
* <pre>
* StringUtils.isBlank(null) = true
* StringUtils.isBlank("") = true
* StringUtils.isBlank(" ") = true
* StringUtils.isBlank("bob") = false
* StringUtils.isBlank(" bob ") = false
* </pre>
2.4 測驗請求
//根據電子檔案,查詢檔案串列
@GetMapping("/edocEntriesPage")
public RequestResult<?> edocEntriesPage(@RequestParam(value = "https://www.cnblogs.com/xiaoqigui/p/summary",required = false) String summary,
@RequestParam(value = "https://www.cnblogs.com/xiaoqigui/p/pageNo",defaultValue = "https://www.cnblogs.com/xiaoqigui/p/1") Integer pageNo,
@RequestParam(value = "https://www.cnblogs.com/xiaoqigui/p/pageSize",defaultValue = "https://www.cnblogs.com/xiaoqigui/p/3") Integer pageSize){
if(StringUtils.isBlank(summary)){
return ResultBuildUtil.fail();
}
//呼叫業務介面,獲取檔案串列,進行統一回傳
//使用結果構建工具,回傳成功的結果
return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary,pageNo,pageSize));
}
測驗結果:

2.5 commons-lang3 生成6位亂數
2.5.1 依賴
<!-- commons-lang3 start -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!-- commons-lang3 end -->
2.5.2 代碼
String code = RandomStringUtils.randomNumeric(6);
3、統一例外處理
3.1 EdocExceptionEnum 自定義例外列舉
//自定義例外列舉
public enum EdocExceptionEnum {
/**
* 引數為空
*/
EDOC_REQUEST_PARAM_EMPTY("201", "引數為空"),
/**
* 引數為非法
*/
EDOC_REQUEST_PARAM_ILLEGAL("202", "引數非法"),
/**
* 網路例外
*/
EDOC_NETWORK_ERROR("301", "網路例外"),
/**
* 資料庫例外
*/
EDOC_DATABASE_ERROR("401", "資料庫例外"),
/**
* 資料庫例外
*/
EDOC_SYSTEM_ERROR("501", "系統例外");
/**
* 例外碼
*/
private String errCode;
/**
* 例外說明
*/
private String errMsg;
/**
* 提供帶有兩個引數的構造方法
*/
EdocExceptionEnum(String errCode, String errMsg){
this.errCode = errCode;
this.errMsg = errMsg;
}
public String getErrCode() {
return errCode;
}
public String getErrMsg() {
return errMsg;
}
}
3.2 EdocException 自定義例外類
public class EdocException extends RuntimeException{
/*
例外列舉型別全域私有屬性
*/
private EdocExceptionEnum edocExceptionEnum;
//繼承 RuntimeException 生成所有的構造方法
public EdocException() {
}
public EdocException(String message) {
super(message);
}
public EdocException(String message, Throwable cause) {
super(message, cause);
}
public EdocException(Throwable cause) {
super(cause);
}
public EdocException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
//自定義列舉例外建構式
public EdocException(EdocExceptionEnum edocExceptionEnum){
this.edocExceptionEnum = edocExceptionEnum;
}
//獲取列舉例外屬性
public EdocExceptionEnum getEdocExceptionEnum() {
return edocExceptionEnum;
}
}
3.3 EdocExceptionHandler 自定義例外統一處理類
//自定義例外統一處理類
@ControllerAdvice
public class EdocExceptionHandler {
/**
* @author : huayu
* @date : 19/10/2022
* @param : [edocException]
* @return : requestResoult<?>
* @description : 系統自定義例外處理,對系統中所有拋出自定義的例外,都會進行統一攔截處理,實作統一回傳
*/
@ExceptionHandler(EdocException.class) //指定對該自定義例外類 進行處理
@ResponseBody //指定回傳的資料 為 json型別
public RequestResult<?> handleEdocException(EdocException edocException){
//統一回傳失敗的結果(前提:拋出的必須是帶列舉型別的例外)
return ResultBuildUtil.fail(edocException.getEdocExceptionEnum().getErrCode(),edocException.getEdocExceptionEnum().getErrMsg());
}
}
3.4 請求測驗
@GetMapping("/edocEntriesPage")
public RequestResult<?> edocEntriesPage(@RequestParam(value = "https://www.cnblogs.com/xiaoqigui/p/summary",required = false) String summary,
@RequestParam(value = "https://www.cnblogs.com/xiaoqigui/p/pageNo",defaultValue = "https://www.cnblogs.com/xiaoqigui/p/1") Integer pageNo,
@RequestParam(value = "https://www.cnblogs.com/xiaoqigui/p/pageSize",defaultValue = "https://www.cnblogs.com/xiaoqigui/p/3") Integer pageSize){
//判斷 summary引數是否為空
if(StringUtils.isBlank(summary)){
//拋出自定義例外:使用例外列舉
throw new EdocException(EdocExceptionEnum.EDOC_REQUEST_PARAM_EMPTY);
}
////拋出自定義例外:使用例外列舉
try {
return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary,pageNo,pageSize));
} catch (Exception e) {
//e.printStackTrace();
//拋出自定義例外:使用例外列舉
throw new EdocException(EdocExceptionEnum.EDOC_DATABASE_ERROR);
}
}
測驗請求引數為空:

測驗資料庫密碼錯誤:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518463.html
標籤:Java
上一篇:Java程式員必會Synchronized底層原理剖析
下一篇:架構中的設計模式
