簡體   English   中英

實體參數(Google Cloud Endpoints)的多態JSON反序列化(Jackson)

[英]Polymorphic JSON deserialization (Jackson) of entity parameters (Google Cloud Endpoints)

我有一個Cloud Endpoints API方法,該方法帶有一個實體參數 (即JSON請求主體映射到POJO)。 該對象包含一個類型為抽象類的字段,即:

public class APIRequest {
  public String customerName;

  public BaseFilter filter;
}

前面提到的API方法具有以下簽名:

public SomeResponsePOJO doTheThing(User user, APIRequest requestEntity)

現在,根據Jackson的文檔 ,應該可以對抽象類進行注釋,以便在反序列化時,創建適當的具體類的實例,並由請求上的附加類型參數控制。

根據文檔,我對抽象類進行了如下注釋:

@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="filterType")
@JsonSubTypes({
  @Type(value = PeriodFilter.class, name = "Period")
})
public abstract class BaseFilter {
  ...
}

其中PeriodFilter是BaseFilter的具體子類:

public class PeriodFilter extends BaseFilter {
  private Date startDate;
  private Date endDate;

  ...
}

然后使用以下正文進行請求:

{
  "customerName": "Derp Pty Ltd",
  "filter": {
    "filterType": "Period",
    "startDate": "2016-01-01",
    "endDate": "2016-01-31"
  }
}

不幸的是,GAE響應以下錯誤:

com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:
  Can not construct instance of <package name>.BaseFilter, problem:
    abstract types can only be instantiated with additional type information
    at [Source: N/A; line: -1, column: -1]
    (through reference chain: <package name>.APIRequest[\"filter\"])

據我從文檔中得知,我已經完成了所有必要的工作。 除非我缺少任何內容,否則上面的錯誤將表明AppEngine將忽略Jackson批注。

我是否錯過了某些東西,或者我想做的事根本不支持Cloud Endpoints?

感謝@BrendanMolloy指出了有關GAE忽略Jackson注釋的相關問題。 我忽略了Google重新打包Jackson的方法,因此它正在尋找自己的注釋實例,而不是Jackson的實例。

從傑克遜的重新打包版本中導入注釋可以按預期方式進行,但顯然不理想-如果Google更改了內容,則很容易在沒有通知的情況下中斷。

似乎在Transformer實現中使用@ApiTransformer和Jackson的ObjectMapper將是最好的方法,因為直接使用@JsonTypeInfo會更好。

暫無
暫無

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

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