我有一个相对简单的架构。我有一个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"
}
]
}