Java 生態 · Initializr · DI/JPA 概覽 · 聯絡 psyche@mail.grokbot.com
開始學習吧!勾選完成的課節。
0% 完成(0/10 課節)
提示:滾動到課節會自動標記完成;點擊課節仍可標記/取消(存於本機)。
一句話:Spring Boot 開 REST → 懂 DI/JPA → 接 OPC Agent API。
| 項目 | Spring Framework | Spring Boot |
|---|---|---|
| 角色 | 核心生態 | 自動設定+內建伺服器 |
| 新手 | 概念多 | 由呢度開始 |
| 產出 | 靈活嵌入 | 可執行 jar |
java -version。./mvnw spring-boot:run(埠 8080)。新增 Controller:
package com.example.demo.web;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/api/hello")
public Map<String, String> hello() {
return Map.of("message", "hello from Spring Boot");
}
}
/api/hello。@Service
public class GreetingService {
public String greet(String name) {
return "Hello, " + name;
}
}
@RestController
public class HelloController {
private final GreetingService greetingService;
public HelloController(GreetingService greetingService) {
this.greetingService = greetingService;
}
@GetMapping("/api/greet")
public Map<String, String> greet() {
return Map.of("message", greetingService.greet("OPC"));
}
}
Initializr → Hello → curl。
public record TaskRequest(String title) {}
public record TaskResponse(String id, String title) {}
@PostMapping("/api/tasks")
public TaskResponse create(@RequestBody TaskRequest req) {
// 教學版:記憶體 Map;之後再換 JPA
String id = java.util.UUID.randomUUID().toString();
return new TaskResponse(id, req.title());
}
" data-en="curl -X POST localhost:8080/api/tasks -H 'Content-Type: application/json' -d '{"title":"ship OPC"}'" data-i18n-html="1">用 curl POST JSON。
@PostMapping("/hooks/agent")
public Map<String, Object> onAgent(@RequestHeader(value="X-Hook-Secret", required=false) String secret,
@RequestBody Map<String, Object> body) {
// 1) 比對 secret(來自環境變數)2) 驗證必要欄位 3) 入隊/寫庫 4) 回 202
return Map.of("accepted", true);
}
先本機驗,再公網;配 n8n/Agent。
站內相關課見連結。
Boot=開箱即用起步。
識基本+用 mvnw 即可起步。
API/webhook+防衛控制。
企業 JVM→Spring;快速原型→Python。
□ JDK 版本:17 / 21 / 其他:________ java -version 通過:□ □ 建置:Maven / Gradle GroupId:________ Artifact:________ □ Boot 版本(穩定):________ Java 版本對齊:□ □ Dependencies:Spring Web □ Validation □ Data JPA □ DB:H2 / Postgres / 其他 □ 套件結構:…/web …/service …/domain …/config □ application.properties/env:埠、DB URL、唔提交秘密:□ □ 成功標準:GET /api/hello 200+JSON □ Git:.gitignore 含 target/、.idea/、*.env
資源名稱:________ 複數路徑:/api/________ 操作: GET 列表/詳情:________ POST 建立:body 欄位 ________ 回應碼 201/200:________ PUT/PATCH 更新:________ DELETE:軟刪?□ 硬刪?□ 錯誤:400 驗證/401 未登入/403 無權/404/409 衝突/429 限速 分頁:?page=&size= 排序:?sort= 版本:□ 無 □ /api/v1 □ Header 備註/OpenAPI:________
Agent/自動化工具:n8n / OpenClaw / Hermes / 其他:________ 端點:POST /api/________ 或 webhook:/hooks/________ 輸入(JSON schema 要點):________ 輸出(摘要+id):________ 超時:________ ms 重試:□ 冪等鍵 ________ 權限:邊啲動作 Agent 可以做/唔可以做:________ 日誌:請求 id ________ 唔記秘密:□ 人工閘門:高風險動作要確認:□
□ 只 HTTPS 對外 □ 關閉唔要嘅 actuator 端點/加保護 □ 輸入驗證(Bean Validation) □ 統一錯誤唔洩漏堆疊畀公眾 □ 認證:API key / JWT / OAuth(揀一)________ □ 授權:最小權限 □ CORS 白名單 □ 秘密:環境變數/密鑰庫 □ 唔入 Git □ 唔入前端 □ 速率限制/體積限制 □ Webhook 簽名驗證 □ 依賴掃描/更新策略 □ 備份與還原演練日期:________ (本表只做防衛加固;唔包含任何攻擊步驟)
實體:________ 主鍵:________ 欄位:________ Repository 介面:JpaRepository<____, ____> 本地先:□ H2 之後:□ Postgres(見 SQL 課) ddl-auto:dev 用 ________ prod 禁用自動改 schema:□ 交易:邊個 Service 方法要 @Transactional:________ 測試:□ @DataJpaTest 或 Testcontainers(進階) 遷移工具(可選):Flyway / Liquibase / 未定
登入會員後可將整門課標記完成並同步至儀表板。