REST(Representational State Transfer)作為 Web 服務架構風格的事實標準,在 Java 生態中擁有豐富的實現路徑。本文系統梳理 Java 端構建 RESTful 服務的五大主流方案,從底層 Servlet 到高階框架,助你根據專案需求選型。
JAX-WS 本為 SOAP 服務設計,但透過 Provider<Source> 與 Dispatch 機制,可繞過 SOAP 棧直接處理原始 XML(POX)或 JSON,實現 REST 風格端點。
@WebServiceProvider 替代 @WebServiceProvider<Source> 介面@BindingType(value = HTTPBinding.HTTP_BINDING) 宣告處理純 HTTP 而非 SOAPMessageContext 獲取 HTTP Method 進行路由分發| 模式 | 適用場景 | 關鍵點 |
|---|---|---|
| Provider 脫離 Dispatch | 服務端獨立演進 | GET/DELETE 無需 Body;POST/PUT 可透過 Header 或模擬 Dispatch Body 格式傳參 |
| Dispatch 脫離 Provider | 客戶端調用傳統 SOAP 服務 | 手動構造 SOAP 封包,服務端可為標準 SOAP Web Service |
REST 本質即 HTTP 架構風格,直接繼承 HttpServlet 並重寫 doGet、doPost、doPut、doDelete、doHead、doOptions 等方法,即可完全掌控 Request/Response,零依賴實現 REST 服務。適合極簡場景或教學驗證,但缺乏參數綁定、內容協商、異常映射等現代框架特性,生產環境維護成本高。
JAX-RS 以註解方式將普通 Java 類標記為 REST 資源,方法映射 HTTP 動詞,是目前業界主流標準。核心註解:
@Path:資源路徑@GET/@POST/@PUT/@DELETE:HTTP 方法映射@Produces/@Consumes:媒體類型協商@PathParam/@QueryParam/@HeaderParam:參數提取| 框架 | 特點 | 適用場景 |
|---|---|---|
| Jersey | JAX-RS 參考實現,功能最全,擴展性強 | 企業級應用、需深度定制場景 |
| Apache CXF | 同時支援 JAX-RS 與 JAX-WS,整合 Spring 極佳 | 混合 SOAP/REST 遷移專案 |
| RESTEasy | JBoss 原生,整合 CDI、EJB 無縫 | WildFly/JBoss EAP 環境 |
| Apache Wink | 輕量、模組化,客戶端 API 優雅 | 資源受限、微服務網關 |
| 維度 | 推薦方案 | 理由 |
|---|---|---|
| 標準化與長期維護 | JAX-RS (Jersey/RESTEasy) | JSR 標準,社區活躍,人才易招聘 |
| 微服務快速開發 | Spring Boot + Spring MVC (支援 JAX-RS 註解) | 生態完善,自動配置,運維友好 |
| 既有 SOAP 系統漸進式遷移 | Apache CXF | 單代碼庫雙協議共存 |
| 極簡/教學/邊緣計算 | HttpServlet / Restlet | 零/少依賴,啟動極快 |
| 避免框架鎖定 | JAX-RS 標準 API + 多實現測試 | 代碼可移植於任意相容容器 |
ExceptionMapper<Throwable> 映射為標準 HTTP 狀態碼與錯誤體。@Produces(MediaType.APPLICATION_JSON) 預設輸出 JSON,配合 Jackson 實現靈活序列化。ContainerRequestFilter/ContainerResponseFilter 實現認證、日誌、壓縮等橫切關注點。/v1/)或 Header(Accept: application/vnd.myapp.v1+json)管理版本。