99国产精品欲av蜜臀,可以直接免费观看的AV网站,gogogo高清免费完整版,啊灬啊灬啊灬免费毛片

網易首頁 > 網易號 > 正文 申請入駐

從阿里跳槽來的工程師,寫個Controller都這么優雅!

0
分享至

目錄

  • 一個優秀的Controller層邏輯
  • 從現狀看問題
  • 改造 Controller 層邏輯
  • 總結

一個優秀的Controller層邏輯

說到 Controller,相信大家都不陌生,它可以很方便地對外提供數據接口。它的定位,我認為是「不可或缺的配角」,說它不可或缺是因為無論是傳統的三層架構還是現在的COLA架構,Controller 層依舊有一席之地,說明他的必要性;說它是配角是因為 Controller 層的代碼一般是不負責具體的邏輯業務邏輯實現,但是它負責接收和響應請求

從現狀看問題

Controller 主要的工作有以下幾項

  • 接收請求并解析參數

  • 調用 Service 執行具體的業務代碼(可能包含參數校驗)

  • 捕獲業務邏輯異常做出反饋

  • 業務邏輯執行成功做出響應


//DTO
@Data
public class TestDTO {
private Integer num;
private String type;

//Service
@Service
public class TestService {

public Double service(TestDTO testDTO) throws Exception {
if (testDTO.getNum() <= 0) {
throw new Exception("輸入的數字需要大于0");
}
if (testDTO.getType().equals("square")) {
return Math.pow(testDTO.getNum(), 2);
}
if (testDTO.getType().equals("factorial")) {
double result = 1;
int num = testDTO.getNum();
while (num > 1) {
result = result * num;
num -= 1;
}
return result;
}
throw new Exception("未識別的算法");
}
}

//Controller
@RestController
public class TestController {

private TestService testService;

@PostMapping("/test")
public Double test(@RequestBody TestDTO testDTO) {
try {
Double result = this.testService.service(testDTO);
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

@Autowired
public DTOid setTestService(TestService testService) {
this.testService = testService;
}
}

如果真的按照上面所列的工作項來開發 Controller 代碼會有幾個問題

  1. 參數校驗過多地耦合了業務代碼,違背單一職責原則

  2. 可能在多個業務中都拋出同一個異常,導致代碼重復

  3. 各種異常反饋和成功響應格式不統一,接口對接不友好

改造 Controller 層邏輯

統一返回結構

統一返回值類型無論項目前后端是否分離都是非常必要的,方便對接接口的開發人員更加清晰地知道這個接口的調用是否成功(不能僅僅簡單地看返回值是否為 null就判斷成功與否,因為有些接口的設計就是如此),使用一個狀態碼、狀態信息就能清楚地了解接口調用情況


//定義返回數據結構
public interface IResult {
Integer getCode();
String getMessage();

//常用結果的枚舉
public enum ResultEnum implements IResult {
SUCCESS(2001, "接口調用成功"),
VALIDATE_FAILED(2002, "參數校驗失敗"),
COMMON_FAILED(2003, "接口調用失敗"),
FORBIDDEN(2004, "沒有權限訪問資源");

private Integer code;
private String message;

//省略get、set方法和構造方法
}

//統一返回數據結構
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;
private String message;
private T data;

public static Result success(T data) {
return new Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data);
}

public static Result success(String message, T data) {
return new Result<>(ResultEnum.SUCCESS.getCode(), message, data);
}

public static Result failed() {
return new Result<>(ResultEnum.COMMON_FAILED.getCode(), ResultEnum.COMMON_FAILED.getMessage(), null);
}

public static Result failed(String message) {
return new Result<>(ResultEnum.COMMON_FAILED.getCode(), message, null);
}

public static Result failed(IResult errorResult) {
return new Result<>(errorResult.getCode(), errorResult.getMessage(), null);
}

public static Result instance(Integer code, String message, T data) {
Result result = new Result<>();
result.setCode(code);
result.setMessage(message);
result.setData(data);
return result;
}
}

統一返回結構后,在 Controller 中就可以使用了,但是每一個 Controller 都寫這么一段最終封裝的邏輯,這些都是很重復的工作,所以還要繼續想辦法進一步處理統一返回結構

統一包裝處理

Spring 中提供了一個類ResponseBodyAdvice,能幫助我們實現上述需求

ResponseBodyAdvice是對 Controller 返回的內容在HttpMessageConverter進行類型轉換之前攔截,進行相應的處理操作后,再將結果返回給客戶端。那這樣就可以把統一包裝的工作放到這個類里面。


public interface ResponseBodyAdvice {
boolean supports(MethodParameter returnType, Classextends HttpMessageConverter> converterType);

@Nullable
T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType, Classextends HttpMessageConverter> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response);
}

  • supports:判斷是否要交給 beforeBodyWrite 方法執行,ture:需要;false:不需要

  • beforeBodyWrite:對 response 進行具體的處理


// 如果引入了swagger或knife4j的文檔生成組件,這里需要僅掃描自己項目的包,否則文檔無法正常生成
@RestControllerAdvice(basePackages = "com.example.demo")
public class ResponseAdvice implements ResponseBodyAdvice

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
正式攤牌?成都蓉城召開工作會議,泄露重要信息:球隊真沒錢了

正式攤牌?成都蓉城召開工作會議,泄露重要信息:球隊真沒錢了

國足風云
2025-07-23 14:23:47
周恩來祭拜孫中山,得知守靈人20年未發餉,總理問:他給你多少錢

周恩來祭拜孫中山,得知守靈人20年未發餉,總理問:他給你多少錢

與史說
2025-07-23 12:12:43
7月23日人社部發布會!養老金調整塵埃落定,部分地區已補發

7月23日人社部發布會!養老金調整塵埃落定,部分地區已補發

娛樂看阿敞
2025-07-23 10:22:05
宗慶后被曝有7子,看了宗馥莉為他立的墓碑,才知道她早就布局了

宗慶后被曝有7子,看了宗馥莉為他立的墓碑,才知道她早就布局了

麥大人
2025-07-18 12:05:16
他曾是東方衛視最帥主持人,巔峰期入獄,多年奮斗歸零

他曾是東方衛視最帥主持人,巔峰期入獄,多年奮斗歸零

雄哥說職場
2025-07-22 20:03:54
結束流浪!25歲菲利克斯三賽季5次換隊,1億身價的金童僅剩2000萬

結束流浪!25歲菲利克斯三賽季5次換隊,1億身價的金童僅剩2000萬

直播吧
2025-07-23 14:46:08
中紀委:醫務人員禁止參加這20種飯局!

中紀委:醫務人員禁止參加這20種飯局!

康迅網
2025-07-23 16:37:07
雅魯藏布江水電工程僅離中印實控線18公里,難道不怕被印度攻擊?

雅魯藏布江水電工程僅離中印實控線18公里,難道不怕被印度攻擊?

龍牙的一座山
2025-07-23 12:05:25
四川全運女籃公布球隊大名單:李夢、韓旭、王思雨、李緣、賈賽琪等國手云集

四川全運女籃公布球隊大名單:李夢、韓旭、王思雨、李緣、賈賽琪等國手云集

雷速體育
2025-07-23 15:41:06
必須殺一儆百!中企勾結美國軍工偷運3834噸稀土,重拳整治啟動!

必須殺一儆百!中企勾結美國軍工偷運3834噸稀土,重拳整治啟動!

娛樂洞察點點
2025-07-23 10:07:57
我軍頂級的軍事天才只有一人,他打的仗,西點軍校復盤也打不出來

我軍頂級的軍事天才只有一人,他打的仗,西點軍校復盤也打不出來

南書房
2025-07-20 20:55:03
江蘇“跑圈女神”牟燕飛去世!年僅38歲仨孩子,前后半年判若兩人

江蘇“跑圈女神”牟燕飛去世!年僅38歲仨孩子,前后半年判若兩人

裕豐娛間說
2025-07-21 10:03:18
保羅更新個人社媒曬出一個“握手”表情,感謝比爾將3號球衣讓給自己

保羅更新個人社媒曬出一個“握手”表情,感謝比爾將3號球衣讓給自己

雷速體育
2025-07-23 07:52:35
湖南桂陽衛健局:4歲男童拔牙死亡涉事醫生停崗

湖南桂陽衛健局:4歲男童拔牙死亡涉事醫生停崗

界面新聞
2025-07-23 16:46:52
為驗證祖先是中國人,6名南島語族后人駕獨木舟,航行116天來中國

為驗證祖先是中國人,6名南島語族后人駕獨木舟,航行116天來中國

博覽歷史
2025-07-22 15:20:03
思考16天后,李在明決定見中方,還給俄方遞請帖,普京有口信傳達

思考16天后,李在明決定見中方,還給俄方遞請帖,普京有口信傳達

歷史有些冷
2025-07-22 17:55:03
央視曝光!你以為沒壞實際早已“細菌爆表”的5種食物,趕緊扔了

央視曝光!你以為沒壞實際早已“細菌爆表”的5種食物,趕緊扔了

阿傖說事
2025-07-22 08:00:09
果然被猜中了!江蘇丹陽兩條杜賓犬飛撲幼童,警方:已妥善處理

果然被猜中了!江蘇丹陽兩條杜賓犬飛撲幼童,警方:已妥善處理

奇思妙想草葉君
2025-07-22 14:44:34
今年高考錄取:文科遍地哀嚎,清北也不例外!鐵飯碗專業被捧上天

今年高考錄取:文科遍地哀嚎,清北也不例外!鐵飯碗專業被捧上天

狐貍先森講升學規劃
2025-07-20 18:55:03
搞笑神回復:被求婚8次都沒答應,后來收到了男友的結婚喜訊!

搞笑神回復:被求婚8次都沒答應,后來收到了男友的結婚喜訊!

石辰搞笑日常
2025-07-23 01:17:18
2025-07-23 20:04:49
Meta
Meta
關注java進階架構師送架構
1059文章數 9856關注度
往期回顧 全部

科技要聞

別自嗨了!XREAL徐馳:AI眼鏡只有5歲智商

頭條要聞

印度、孟加拉關切雅魯藏布江下游水電站工程 中方回應

頭條要聞

印度、孟加拉關切雅魯藏布江下游水電站工程 中方回應

體育要聞

英格蘭最紅球星 也是加勒比島國驕傲

娛樂要聞

汪峰森林北同游日本 各帶各娃互不耽誤

財經要聞

律師解析娃哈哈遺產案:遺囑是最大變數

汽車要聞

德系大招放盡 場地極限測試全新奧迪A5L

態度原創

藝術
游戲
時尚
手機
本地

藝術要聞

故宮珍藏的墨跡《十七帖》,比拓本更精良,這才是地道的魏晉寫法

LPL第三階段:TES零封FPX,要想改變口碑,還需要成績說話

看來看去還是這些穿搭適合普通人!配色不艷、衣服不花,好得體

手機要聞

主流安卓品牌中,誰兼容蘋果生態最好?

本地新聞

這雙丑鞋“泰”辣眼,跪求內娛不要抄作業

無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 偏关县| 黑水县| 同仁县| 麦盖提县| 长垣县| 三亚市| 成都市| 泸西县| 广汉市| 五指山市| 黄浦区| 扶绥县| 东乌珠穆沁旗| 砀山县| 巴塘县| 双江| 靖江市| 江陵县| 秦皇岛市| 宿松县| 郁南县| 平塘县| 秀山| 灵寿县| 鄂温| 广河县| 汾阳市| 关岭| 绿春县| 海宁市| 灵丘县| 民乐县| 武宁县| 综艺| 时尚| 灌阳县| 双桥区| 黄浦区| 华蓥市| 庐江县| 云阳县|