簡體   English   中英

在jersey中處理REST API的全部和部分視圖

[英]Handling full and partial views in jersey for a REST API

我正在為項目創建RESTful API。 我在嘗試使用jersey實施時遇到一些問題:

  1. 我的對象模型顯然不包含uri信息。 例如,假設我有一個水果課。 水果對象可以說是FruitName和FruitColor。 但是在響應中,我還需要發送一個URI。 通常如何處理? 我是否應該創建一個單獨的“ FruitResource”,它的構造函數接受“ Fruit”並從中創建完整的資源,包括URI? 我也需要在嵌套對象中使用URI,例如,如果要返回Child對象的列表,則需要每個Child對象也具有一個URI,但是我不希望URI成為對象模型的一部分。 什么是最干凈的方法?

  2. 我希望能夠返回相同資源的全部和部分視圖。 例如,部分視圖僅具有名稱和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.classBeanLite.class具有我需要進行摘要的屬性,然后是一個Bean.class ,用於對其進行更詳細的擴展。 您可以將兩者都添加到ORM中,並提供一個選項來切換DAO中的表示形式。

感謝您的所有回復。 經過你們介紹的所有方法,並經過我自己的一點研究,這就是我的目標:

1)我添加uri作為對象模型的一部分。 對於我來說,這似乎是最干凈的解決方案。 每當創建對象時(使用對象的其他屬性),都可以自動填充URI。 早些時候,我認為這是個壞主意,但是除了必須隨對象一起移動的額外領域之外,我無法預見這種方法的任何問題。

2)為了支持全部/部分視圖,我嘗試使用@JsonView批注。 這似乎是一個好方法。

讓我知道這種處理方式是否還有其他潛在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM