繁体   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