首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 JAX-RS (JSR-311) 建立 RESTful Web 服務完整指南

     編輯:Java 相關知識

JAX-RS 核心資源模型

JAX-RS 以註解驅動,定義五種資源類型:

程式碼範例:員工聯絡資源

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 服務的標準選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型說明關鍵註解
Root Resource入口類別,對應基礎路徑@Path
Sub-resource由 Sub-resource Locator 回傳,處理子路徑無 @Path,含 HTTP 方法註解
Resource MethodRoot/Sub-resource 內直接處理請求的方法@GET、@POST…
Sub-resource MethodResource Method 進一步綁定子路徑@Path + HTTP 方法
Sub-resource Locator動態決定後續處理物件,無 HTTP 方法註解@Path 無 HTTP 方法