REST(Representational State Transfer)非標準而是架構風格,基於 HTTP/URI/XML 等成熟協議,核心原則三條:
/users/123/accounts)Accept/Content-Type 協商格式,降低客戶端與服務端耦合javax.ws.rs 統一接口,避免綁定第三方框架web.xml 即可切換@Path("/")
public class BookkeepingService {
@Path("/person/")
@POST
@Consumes("application/json")
public Response createPerson(Person person) { ... }
@Path("/person/{id:\\d+}/")
@GET
@Produces("application/json")
public Person readPerson(@PathParam("id") int id) { ... }
}
@Path 定義資源路徑,支持正則模板變量({id:\\d+})@Path@GET/@POST/@PUT/@DELETE),子資源定位器無此類註解| 註解 | 來源 | 典型用例 |
|---|---|---|
@PathParam | URI 模板變量 | /person/{id} → @PathParam("id") int id |
@QueryParam | 查詢字符串 | ?name=abc → @QueryParam("name") String name |
@FormParam | 表單參數 | application/x-www-form-urlencoded |
@HeaderParam | HTTP Header | 認證 Token、客戶端版本 |
@CookieParam | Cookie | Session 追蹤 |
@MatrixParam | 矩陣參數 | /user;id=123;role=admin |
@DefaultValue | 默認值 | 配合上述註解提供兜底值 |
@Encoded | 禁用自動解碼 | 保留特殊字符原始值 |
實體參數:資源方法僅允許一個無註解參數,映射請求體(如 createPerson(Person person) 自動反序列化 JSON)。
void → 204 No ContentResponse → 完全控制狀態碼、Header、EntityGenericEntity → 保留泛型類型信息的 Entity異常處理:拋出 WebApplicationException 或返回攜帶錯誤碼的 Response。
@Context UriInfo uriInfo;
@Context HttpHeaders headers;
@Context SecurityContext security;
@Context HttpServletRequest servletRequest;
支持標準 Java EE 與 Servlet API 類型注入,便於訪問請求上下文。
@Produces 指定可生產格式,@Consumes 指定可消費格式Accept 請求頭選擇響應格式,Content-Type 聲明請求格式@Provider
@Produces("application/json")
@Consumes("application/json")
public class GsonProvider implements MessageBodyWriter<Object>, MessageBodyReader<Object> {
private final Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.setDateFormat("yyyy-MM-dd")
.create();
// 實現 readFrom/writeTo 等方法...
}
通過 @Expose 註解精確控制序列化字段,日期格式統一,避免預設 Gson 行為不符業務預期。
@Entity
@Table(name = "TABLE_ACCOUNT")
@XmlRootElement // JAXB
public class Account {
@Id @GeneratedValue @Column(name="COL_ID") @Expose private int id;
@ManyToOne @JoinColumn(name="COL_PERSON") @Expose private Person person;
@Column(name="COL_AMOUNT") @Expose private BigDecimal amount;
@Column(name="COL_DATE") @Expose private Date date;
@ManyToOne @JoinColumn(name="COL_CATEGORY") @Expose private Category category;
@Column(name="COL_COMMENT") @Expose private String comment;
// getter/setter...
}
三大收益:
@Expose(Gson)、@XmlElement(JAXB)、JPA 註解各司其職web.xml(Servlet 註冊)與 persistence.xml(數據源、方言)JAX-RS 以「約定優於配置」實現了 REST 開發的標準化:註解驅動資源映射、聲明式內容協商、POJO 多重復用。掌握其核心註解語義、參數綁定規則、Provider 擴展機制,即可構建高性能、可演進的 RESTful 服務。