[英]Handling full and partial views in jersey for a REST API
我正在為項目創建RESTful API。 我在嘗試使用jersey實施時遇到一些問題:
我的對象模型顯然不包含uri信息。 例如,假設我有一個水果課。 水果對象可以說是FruitName和FruitColor。 但是在響應中,我還需要發送一個URI。 通常如何處理? 我是否應該創建一個單獨的“ FruitResource”,它的構造函數接受“ Fruit”並從中創建完整的資源,包括URI? 我也需要在嵌套對象中使用URI,例如,如果要返回Child
對象的列表,則需要每個Child
對象也具有一個URI,但是我不希望URI成為對象模型的一部分。 什么是最干凈的方法?
我希望能夠返回相同資源的全部和部分視圖。 例如,部分視圖僅具有名稱和URI。 如何做到這一點?
現在,我擁有的是一個接受請求的Service
類,該類使用DAO
創建和返回從DB建模的對象,並使用jackson將其序列化為JSON。
有一種使用JaxB類的方法,您可以將對象模型傳遞給JaxB類,然后JaxB類生成URI。 以下是小型原型。
UserResource類
@Path("/user")
public class UserResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{user-id}")
public UserJaxB getUser(@PathParam("user-id") String userId, @Context
HttpServletRequest request) {
// now XYZ is hard-coded value
String serviceEndpoint = request.getContextPath() + "/" + "user";
UserModel userModel = new UserModel(userId, "XYZ");
return new UserJaxB(serviceEndpoint,userModel);
}
}
用戶JAXB類
@XmlRootElement
public class UserJaxB {
private String name;
private String id;
private String serviceEndpoint;
private String URI;
public UserJaxB(String serviceEndpoint, UserModel userModel) {
this.name = userModel.getName();
this.id = userModel.getId();
this.serviceEndpoint = serviceEndpoint;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getURI() {
return this.serviceEndpoint + "/" + id;
}
}
用戶模型類公共類UserModel {
String name;
String id;
public UserModel(String name, String id) {
this.name = name;
this.id = id;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
我正在開發一個支持這兩個問題的項目: https : //github.com/skyscreamer/yoga ,其更多信息位於http://yoga.skyscreamer.org/ ,包括演示。
它用定制的解決方案代替了JAX-RS(或Spring MVC)渲染機制,該解決方案更符合REST系統的需求。
對於#1,我們有一個注釋,您必須將其應用於您的Child pojo。 JAX-RS的注釋旨在將URL映射到控制器而不是底層對象,因此我們需要一個自定義解決方案...但實際上,每個pojo只能歸結為1個附加注釋。
對於#2,我們有一個基於URL的機制,用於指定您希望從pojo或pojo的子級中獲得哪些附加信息(並且可以進一步嵌套)。
我希望這有幫助。
1)我不知道任何支持此功能的Jersey或JAX-RS機制。 不過,似乎必須將URI添加到每個域類的構造函數中,這似乎是一種不好的做法。 您可以創建一個方面來攔截該方法並將響應包裝在一個新對象中-在包裝器中添加資源的URI(您可以通過攔截器的反射獲得URIInfo)。 我在構建etag支持時就已經這樣做了,因此不必在每個響應中都添加緩存代碼。 我想您也可以在相同方面添加一些內容來處理子URI問題...
您可能還想看看這些問題:
2)為了構建“更輕”的響應實體,我通常具有一個BeanLite.class
, BeanLite.class
具有我需要進行摘要的屬性,然后是一個Bean.class
,用於對其進行更詳細的擴展。 您可以將兩者都添加到ORM中,並提供一個選項來切換DAO中的表示形式。
感謝您的所有回復。 經過你們介紹的所有方法,並經過我自己的一點研究,這就是我的目標:
1)我添加uri作為對象模型的一部分。 對於我來說,這似乎是最干凈的解決方案。 每當創建對象時(使用對象的其他屬性),都可以自動填充URI。 早些時候,我認為這是個壞主意,但是除了必須隨對象一起移動的額外領域之外,我無法預見這種方法的任何問題。
2)為了支持全部/部分視圖,我嘗試使用@JsonView
批注。 這似乎是一個好方法。
讓我知道這種處理方式是否還有其他潛在問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.