簡體   English   中英

返回的JSON對象不尊重繼承嗎?

[英]Returned JSON object does not respect inheritance?

我有一個Google Cloud Endpoint API,該API返回一個Product對象。 該產品對象本身包含另一個很大的對象Brand (id,名稱,文本,描述,圖像URL等)。 獲取產品列表時,我不需要Brand內的全部信息,只需ID和標題即可。

因此,我嘗試將Brand BrandBase為一個基類BrandBase ,該基類僅包含一組有限的屬性(僅id和title)。 public BrandBase getBrand()方法的Product內,我返回一個BrandBase對象。

但是,然后查看Google Cloud Endpoints的JSON輸出-我仍然可以獲得完整的Brand內容(包括所有文本,描述等)。 因此,看起來Google Cloud Endpoint只是查看對象類型並序列化所有內容,而不管類本身中指定的返回類型如何?

@Entity
public class Product {
  @Id
  private Long id;

  @Index
  private Ref<BrandBase> brand;

  public BrandBase getBrand() {
    return brand.get();
  }

  public void setBrand(BrandBase brand) {
    this.brand = Ref.create(brand);
  }
  ...
}

@Entity
public class Brand extends BrandBase {

  @Id
  private Long id;
  @Index
  private String name;
  private String text;
  private String contact;
  ... all getter/setter ...
}

public abstract class BrandBase {
  public abstract Long getId();
  public abstract String getName();
  public abstract void setName(String name);
}

返回的JSON是:

{
   "id": "6298002603900928",
   "title": "magna aliquyam erat, sed",
   "description": "Lorem ipsum dolor sit amet...",
   "brand": {
     "id": "6192449487634432",
     "name": "no",
     "text": "Lorem ipsum dolor sit amet, ...",
     "contact": "Lorem ipsum dolor..."
   }
 }

因此它仍然包含textcontact -在BrandBase類中均未指定。

這是Google Cloud Endpoints的錯誤或功能嗎? 還是有其他方法來獲得我想要的行為:我只想在產品內部放置淺品牌的對象,而不是完整品牌的對象。

這絕對不是端點中的錯誤,否則將無法返回多態對象。 此外,現有的每個JSON序列化程序都以相同的方式工作。

我不是Cloud Endpoints的專家,但是我經常遇到此架構問題,並以相同的方式解決它:

您需要將數據模型與API模型分開。 來回傳遞實體對象僅適用於非常簡單的實體對象和非常簡單的應用程序。 當您為不同的調用者需要不同的對象視圖或隱藏一些數據時,該考慮單獨的DTO了。

對於難以升級的客戶端(例如在現場部署的本機應用程序),應立即從DTO開始。 這使您可以自由地重構您認為合適的數據模型,同時仔細控制API兼容性。 是的,這需要更多工作,但是它將為您省去很多麻煩。 使用http://projectlombok.org/擺脫大部分樣板。

暫無
暫無

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

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