为什么杰克逊认为这个对象是一个子类型(当它真的没有时)?

时间:2017-07-28 16:03:02

标签: java json jackson

我有一个相对简单的架构。我有一个Subscription对象,其中包含对User的引用。另一方面,我有一个User对象引用了Subscription的数组。

问题是,当Jackson尝试反序列化包含User数组的Subscription JSON有效内容时,会抛出InvalidTypeIdException声称Subscription无法解析作为User的子类型。为什么?因为Subscription不是User的子类型。

User架构如下:

public class User extends Base {

  private List<Subscription> subscriptions;

  // other props & getters/setters
}

Subscription架构是:

public class Subscription extends Base {

  private User user;

  // other props & getters/setters
}

这两个类都定义了getter和setter。对于上下文,这里是Base类模式。请注意,我们已使用@JsonTypeInfo注释:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "model-type", visible = true)
public abstract class Base {
    protected String id;
}

引发的特定异常是:

Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'Subscription' into a subtype of [simple type, class com.random.package.viewmodel.User]: known type ids = [User]
 at [Source: java.io.PushbackInputStream@5c86366e; line: 17, column: 5] (through reference chain: com.random.package.viewmodel.User["subscriptions"]->java.util.ArrayList[0])

那为什么会这样呢?我知道@JsonTypeInfo正在扮演一个角色,但我们的模型架构的其他部分需要它。这与我的Base班级有什么关系?

由于这两个实体之间的双向性,我认为这可能会发生。因此,我尝试将@JsonManagedReference@JsonBackReference@JsonIgnore添加到用户的订阅字段,但没有成功。

那么我怎样才能让杰克逊在这两种类型中发挥出色呢?

这里有进一步的参考,这是在序列化的JSON:

{
  "model-type": "User",
  "id": "peppermint-patty",
  "stub": false,
  "email": "random@randomemail.com",
  "username": "Peppermint Patty",
  "schema-version": "v1",
  "first-name": "Peppermint",
  "last-name": "Patty",
  "subscriptions": [
    {
      "id": "da73402f-9258-4284-a80a-5a050b4e721d",
      "schema-version": "v1",
      "model-type": "Subscription"    
    }
  ]
} 

0 个答案:

没有答案