Spring Boot 接口開發提示詞(Controller / Service / Repository 分層、參數校驗、全局異常處理、統一返回)

用 Spring Boot 寫增刪改查接口和業務接口時用:描述實體和業務規則,得到分層清晰的代碼,包括請求與響應對象、Bean Validation 參數校驗、事務邊界、全局異常處理、統一錯誤返回和分層測試,避免把實體直接暴露給前端。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名有多年 Spring Boot 項目經驗的 Java 後端工程師。請根據需求生成接口代碼。

- Spring Boot 與 Java 版本:[版本](例:Spring Boot 3.3 + Java 21)
- 持久層:[持久層](例:Spring Data JPA、MyBatis-Plus)
- 業務需求:[業務需求](例:優惠券的創建、領取、查詢)
- 業務規則:[業務規則](例:每人限領 1 張,庫存為 0 不可領)
- 項目已有約定:[項目約定](例:統一返回結構、包結構)

生成要求:
1. 分層職責:Controller 只做參數接收、校驗和結果轉換;Service 負責業務規則與事務;Repository 或 Mapper 只做數據訪問。不要在 Controller 中寫業務邏輯。
2. 對象劃分:請求對象、響應對象與數據庫實體分開;轉換方式(手寫或使用映射工具)與項目保持一致;響應中不包含敏感字段。
3. 參數校驗:使用 Bean Validation 註解;分組校驗或嵌套對象校驗的寫法;校驗失敗返回字段級錯誤訊息。
4. 事務:事務註解加在 Service 的公開方法上;說明同類方法內部調用時事務不生效的問題;只讀查詢標記為只讀事務。
5. 並發:「每人限領 1 張、庫存扣減」這類規則要在數據庫層面保證(唯一約束、條件更新),不能只靠先查詢再判斷。
6. 異常處理:自定義業務異常,用全局異常處理器統一轉換為錯誤返回;區分業務錯誤(4xx)和系統錯誤(5xx);系統錯誤不向客戶端返回堆棧。
7. 測試:Service 層單元測試(模擬倉儲);Controller 層使用切片測試驗證參數校驗和錯誤返回;關鍵的並發規則寫一個集成測試。

輸出:包結構、各層代碼(中文註釋)、統一返回與全局異常處理代碼、測試代碼。註明 Spring Boot 3 與 2 的差異(例如 Jakarta 包名)。

高亮處換成你自己的內容:[版本]、[持久層]、[業務需求]、[業務規則]、[項目約定]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[版本] 必須寫,Spring Boot 3 起校驗與持久化相關的包名從 javax 改為 jakarta,照搬 2.x 的代碼會編譯失敗。[項目約定] 有統一返回結構或包結構約定的,一定貼進來,生成的代碼才能直接放進項目。

常見坑:

  • 在同一個 Service 類中,一個方法調用另一個帶事務註解的方法,事務不會生效,因為調用沒有經過代理。
  • 「每人限領 1 張」用先查詢、再插入實現,並發時同一個人可以領到兩張。在數據庫加唯一約束兜底。
  • 直接把 JPA 實體作為接口返回值,懶加載字段可能觸發額外查詢甚至序列化報錯,還容易泄露內部字段。

追問技巧:追問「為這些接口補充 OpenAPI 文檔註解」,或「把領取接口改成高並發版本,說明在庫存扣減上用數據庫條件更新與 Redis 預扣兩種方案的取捨」。

示例輸出

示例,僅供參考(Service 層節選)
java
@Service
@RequiredArgsConstructor
public class CouponService {
    private final CouponRepository couponRepo;
    private final CouponClaimRepository claimRepo;

    @Transactional
    public ClaimResult claim(long couponId, long userId) {
        // 條件更新扣減庫存:庫存為 0 時影響行數為 0,避免超領
        int updated = couponRepo.decreaseStock(couponId);
        if (updated == 0) {
            throw new BizException(ErrorCode.COUPON_OUT_OF_STOCK, "優惠券已領完");
        }
        try {
            // coupon_claim 表上有 (coupon_id, user_id) 唯一約束,保證每人限領 1 張
            claimRepo.saveAndFlush(new CouponClaim(couponId, userId));
        } catch (DataIntegrityViolationException e) {
            throw new BizException(ErrorCode.COUPON_ALREADY_CLAIMED, "每人限領 1 張");
        }
        return new ClaimResult(couponId);
    }
}
java
@Modifying
@Query("UPDATE Coupon c SET c.stock = c.stock - 1 WHERE c.id = :id AND c.stock > 0")
int decreaseStock(@Param("id") long id);

拋出業務異常會讓事務回滾,已扣減的庫存隨之恢復。

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~