一文詳解SpringBoot服務(wù)中添加字段的完整指南
前言
在日常開發(fā)中,我們經(jīng)常需要為現(xiàn)有的API接口添加新的返回字段。這看似簡(jiǎn)單,但涉及到多個(gè)層面的修改,需要遵循一定的規(guī)范和流程。本文將以一個(gè)實(shí)際案例為例,詳細(xì)介紹如何在Spring Boot項(xiàng)目中為服務(wù)接口添加新字段。
案例背景
假設(shè)我們需要為/records接口添加checkInNo字段,該字段來(lái)自room_checkin表的check_in_no列。
實(shí)施步驟
1. 分析現(xiàn)有代碼結(jié)構(gòu)
首先需要了解相關(guān)的代碼層次結(jié)構(gòu):
- Controller層:處理HTTP請(qǐng)求
- Service層:業(yè)務(wù)邏輯處理
- VO層:數(shù)據(jù)傳輸對(duì)象
- PO層:持久化對(duì)象
- Mapper層:數(shù)據(jù)庫(kù)訪問(wèn)
2. 修改VO對(duì)象
在數(shù)據(jù)傳輸對(duì)象中添加新字段是最關(guān)鍵的一步。
public class RoomCheckinRecordsVO {
private List<CostRecordVO> costRecords;
private List<RoomRecordSimpleVO> roomRecords;
private BigDecimal costAmount;
private BigDecimal payAmount;
private BigDecimal balance;
// 新增字段
private String checkInNo;
// getter和setter方法
public String getCheckInNo() {
return checkInNo;
}
public RoomCheckinRecordsVO setCheckInNo(String checkInNo) {
this.checkInNo = checkInNo;
return this;
}
}
3. 修改Service實(shí)現(xiàn)層
在服務(wù)實(shí)現(xiàn)類中查詢并設(shè)置新字段的值:
@Override
public RoomCheckinRecordsVO records(Integer checkInId) {
List<CostRecordVO> costRecords = costQuery.queryByCheckInId(checkInId);
List<RoomRecordSimpleVO> roomRecords = roomRecordQuery.queryByCheckInId(checkInId);
// 原有的業(yè)務(wù)邏輯...
List<CostRecordVO> safeCostRecords = costRecords == null ? Collections.emptyList() : costRecords;
BigDecimal payAmount = safeCostRecords.stream()
.filter(Objects::nonNull)
.filter(v -> CheckinCostRecordConstants.TYPE_INCOME_EXPENSE.equals(v.getType()))
.map(CostRecordVO::getAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal costAmount = safeCostRecords.stream()
.filter(Objects::nonNull)
.filter(v -> CheckinCostRecordConstants.TYPE_COST.equals(v.getType()))
.map(CostRecordVO::getAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 查詢?nèi)胱∮涗洬@取checkInNo
RoomCheckinPO checkin = mapper.selectById(checkInId);
String checkInNo = checkin != null ? checkin.getCheckInNo() : null;
return new RoomCheckinRecordsVO()
.setCostRecords(costRecords)
.setRoomRecords(roomRecords)
.setCostAmount(costAmount)
.setPayAmount(payAmount)
.setBalance(payAmount.subtract(costAmount))
.setCheckInNo(checkInNo); // 設(shè)置新字段
}
4. 驗(yàn)證修改
確保編譯通過(guò)且沒(méi)有語(yǔ)法錯(cuò)誤:
mvn compile
或者在IDE中檢查是否有編譯錯(cuò)誤。
最佳實(shí)踐建議
1. 字段命名規(guī)范
- 使用駝峰命名法
- 保持與數(shù)據(jù)庫(kù)字段的映射關(guān)系清晰
- 遵循項(xiàng)目現(xiàn)有的命名約定
2. 空值處理
// 推薦的做法
String checkInNo = checkin != null ? checkin.getCheckInNo() : null;
// 或者使用Optional(Java 8+)
String checkInNo = Optional.ofNullable(checkin)
.map(RoomCheckinPO::getCheckInNo)
.orElse(null);
3. 事務(wù)處理
如果涉及數(shù)據(jù)庫(kù)修改,確保使用適當(dāng)?shù)氖聞?wù)注解:
@Transactional(rollbackFor = Exception.class)
4. 日志記錄
對(duì)于重要的業(yè)務(wù)邏輯變更,添加適當(dāng)?shù)娜罩荆?/p>
logger.info("查詢?nèi)胱∮涗?,checkInId: {}, checkInNo: {}", checkInId, checkInNo);
注意事項(xiàng)
- 向后兼容性:新增字段不應(yīng)影響現(xiàn)有功能
- 性能考慮:避免不必要的數(shù)據(jù)庫(kù)查詢
- 代碼復(fù)用:如果多個(gè)地方需要相同數(shù)據(jù),考慮提取公共方法
- 測(cè)試覆蓋:確保相關(guān)單元測(cè)試和集成測(cè)試通過(guò)
總結(jié)
添加字段雖然是常見(jiàn)的開發(fā)任務(wù),但仍需謹(jǐn)慎處理。完整的流程包括:
- 分析需求和現(xiàn)有代碼結(jié)構(gòu)
- 修改VO對(duì)象添加字段
- 更新Service層邏輯
- 驗(yàn)證修改的正確性
- 遵循最佳實(shí)踐和編碼規(guī)范
通過(guò)遵循上述步驟和建議,可以確保代碼修改的安全性和可維護(hù)性。
這個(gè)案例展示了在企業(yè)級(jí)Spring Boot項(xiàng)目中進(jìn)行字段擴(kuò)展的標(biāo)準(zhǔn)做法,適用于大多數(shù)類似的開發(fā)場(chǎng)景。
到此這篇關(guān)于一文詳解SpringBoot服務(wù)中添加字段的完整指南的文章就介紹到這了,更多相關(guān)SpringBoot服務(wù)添加字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot實(shí)現(xiàn)加密字段模糊查詢的最佳實(shí)踐
- 使用SpringBoot+MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段級(jí)加密
- SpringBoot結(jié)合MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段加密
- SpringBoot中公共字段自動(dòng)填充的常用技巧
- SpringBoot公共字段自動(dòng)填充實(shí)現(xiàn)與避坑指南
- 在SpringBoot接口中正確地序列化時(shí)間字段的方法
- SpringBoot實(shí)現(xiàn)字段自動(dòng)填充的兩種方式
- Springboot實(shí)現(xiàn)公共字段填充的示例詳解
相關(guān)文章
關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問(wèn)題
這篇文章主要介紹了關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
java實(shí)現(xiàn)科學(xué)計(jì)算器的全過(guò)程與代碼
最近編寫了一個(gè)功能較全面的科學(xué)計(jì)算器,該計(jì)算器不僅能進(jìn)行加、減、乘、除等混合運(yùn)算,而且能計(jì)算sin、cos、tan、log等函數(shù)的值,還要具有清零、退格、求倒數(shù)、求相反數(shù)等功能,這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)科學(xué)計(jì)算器的相關(guān)資料,需要的朋友可以參考下2022-06-06
Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析
這篇文章主要介紹了Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
如何解決java:找不到符號(hào)符號(hào):類__(使用了lombok的注解)
在使用IntelliJ IDEA開發(fā)Java項(xiàng)目時(shí),可能遇到通過(guò)@lombok注解自動(dòng)生成get和set方法不生效的問(wèn)題,解決這一問(wèn)題需要幾個(gè)步驟,首先,確認(rèn)Lombok插件已在IDEA中安裝并啟用,其次,確保項(xiàng)目中已添加Lombok的依賴,對(duì)于Maven和Gradle項(xiàng)目2024-10-10
JAVA序列化Serializable及Externalizable區(qū)別詳解
這篇文章主要介紹了JAVA序列化Serializable及Externalizable區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)之事件驅(qū)動(dòng)與CQRS
這篇文章分析了如何應(yīng)用事件來(lái)分離軟件核心復(fù)雜度。探究CQRS為什么廣泛應(yīng)用于DDD項(xiàng)目中,以及如何落地實(shí)現(xiàn)CQRS框架。當(dāng)然我們也要警惕一些失敗的教訓(xùn),利弊分析以后再去抉擇正確的應(yīng)對(duì)之道2021-06-06

