類型 說明 關鍵註解
Root Resource 入口類別,對應基礎路徑 @Path
Sub-resource 由 Sub-resource Locator 回傳,處理子路徑 無 @Path,含 HTTP 方法註解
Resource Method Root/Sub-resource 內直接處理請求的方法 @GET、@POST…
Sub-resource Method Resource Method 進一步綁定子路徑 @Path + HTTP 方法
Sub-resource Locator 動態決定後續處理物件,無 HTTP 方法註解 @Path 無 HTTP 方法
程式碼範例:員工聯絡資源
package com.ibm.jaxrs.sample.organization;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
@Path("/contacts")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public class ContactsResource {
@GET
public List getAllContacts() { /* 回傳所有聯絡人 */ }
@GET
@Path("/{emailAddress:.+@.+\\.[a-z]+}")
public ContactInfo getByEmail(@PathParam("emailAddress") String email) { /* 依 Email 查詢 */ }
@GET
@Path("/{lastName}")
public ContactInfo getByLastName(@PathParam("lastName") String lastName) { /* 依姓氏查詢 */ }
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void addContact(ContactInfo info) { /* 新增聯絡人 */ }
@Path("/contact/{contactName}/department")
public Department getContactDept(@PathParam("contactName") String name) {
return new Department(name); // Sub-resource Locator
}
}
// Sub-resource
class Department {
private String name;
Department(String name) { this.name = name; }
@GET public String getDepartmentName() { return name; }
}
關鍵註解詳解
@Path
值可含常字、變數 {var}、正則 {var:regex}
範例:@Path("/contacts/{email:.+@.+\\.[a-z]+}") 只比對 Email 格式
HTTP 方法註解
@GET、@POST、@PUT、@DELETE、@HEAD 對應 HTTP 動詞。可自訂:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)
@HttpMethod("GET") public @interface CustomGET {}
@Consumes / @Produces
類別/方法層級均可標註,方法優先覆蓋類別
Client 以 Content-Type 決定 @Consumes、以 Accept 決定 @Produces
範例:Accept: application/json → 回傳 JSON;Content-Type: application/xml → 接收 XML
訊息體讀寫提供者
預設支援 String、InputStream、JAXB 物件等。自訂型別需實作:
MessageBodyWriter<T>:序列化輸出,標註 @Provider、@Produces
MessageBodyReader<T>:反序列化輸入,標註 @Provider、@Consumes
@Provider @Produces("application/xml")
public class ContactInfoWriter implements MessageBodyWriter {
public boolean isWriteable(...) { return true; }
public void writeTo(ContactInfo ci, ..., OutputStream out) { ci.serialize(out); }
}
應用程式啟動配置
擴充 javax.ws.rs.core.Application:
public class ContactInfoApplication extends Application {
@Override public Set> getClasses() {
return new HashSet<>(Arrays.asList(
ContactsResource.class, ContactInfoWriter.class, ContactInfoReader.class));
}
@Override public Set getSingletons() { return Collections.emptySet(); }
}
web.xml 部署
不支援 JAX-RS 的容器 (需指定系統 Servlet):
<servlet>
<servlet-name>JAX-RS</servlet-name>
<servlet-class>com.sample.RESTSystemServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.ibm.jaxrs.sample.organization.ContactInfoApplication</param-value>
</init-param>
</servlet>
支援 JAX-RS 的容器 (直接掃描 Application 子類):
<servlet>
<servlet-name>JAX-RS</servlet-name>
<servlet-class>com.ibm.jaxrs.sample.organization.ContactInfoApplication</servlet-class>
</servlet>
Apache Wink 執行環境
Wink 提供完整 JAX-RS 實作,額外支援 JSON/Atom/RSS 序列化、以資源為中心的 Client API。RAD 7.5.5+ 內建 Wink Facet,可自動產生 web.xml 與驗證註解。
結語
JAX-RS 以聲明式註解取代 Servlet 手動解析 URI,讓開發者專注於資源模型與資料轉換。配合 Provider 機制靈活處理媒體型別,Application 類別統一配置,部署極簡。是 Java EE 環境下建構 RESTful 服務的標準選擇。
上一篇文章: JAX-RPC 實作 Web 服務(一):從安裝 Axis 到發布第一個 RPC 服務 下一篇文章: Ivy 教程(11):建構私有倉庫(三)—— 使用 Namespace 統一命名規範
Copyright ©
程式碼之家 All Rights Reserved