我有一个带注释的类,它实现了一个带有一个名为通用的只读属性的接口,因此我可以在程序的其他部分中.id()
提取不同类型的id 。
杰克逊应该忽略整个界面。但相反,我收到以下错误消息:
java.util.concurrent.ExecutionException
:com.fasterxml.jackson.databind.exc.InvalidDefinitionException
: 无法构造实例my.company.Identifiable
(没有创建者,如默认构造,存在):抽象类型要么需要映射到具体类型,具有自定义反序列化器,要么在 [Source: UNKNOWN; 行:-1,列:-1](通过参考链java.util.HashSet[0]
:)
在搜索该异常以及谷歌的整个前两页时,我已经尝试了这里找到的所有解决方案。他们都没有解决我遇到的确切问题,我无法从其中任何一个中插入针对我的具体问题的解决方案,CustomDeserializer
除了我不想写的。
我尝试过使用JsonTypeInfo
,但我以前从未使用过该注释,并且无法弄清楚我应该用它做什么。使用的解决方案与我的略有不同,他们实际上想要接口属性而不是忽略它。
在某些类中没有实际的id
成员变量,它只是method
返回一些被认为是id
程序的另一部分的东西。ID<String>
在某些情况下和ID<Integer>
其他情况下。
我试过用 和 注释,@JsonProperty(access = Access.READ_ONLY)
但@JsonIgnore
它们@JsonIgnoreProperties({"id"})
都没有改变异常。我也试过所有的mode
设置@JsonCreator
,都没有。
接口定义为:
@JsonIgnoreProperties({"id"})
public interface Identifiable<T>
{
@JsonIgnore
public T id();
}
示例类定义为:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements Identifiable<ID<String>>
{
@JsonCreator
public User(@JsonProperty("LoginName") final String loginName,
@JsonProperty("Title") final String name,
@JsonProperty("Email") final String email)
/* lots of irrelevant code redacted */
@JsonIgnore
@Override
public ID<String> id()
{
return new ID.from(this.name);
}
}
这是绑定代码的样子:
final HttpResponse response = req.execute();
final JsonNode root = this.om.readTree(response.getContent());
final JsonNode results = root.get("d").get("results");
final Set<V> values = this.om.readValue(this.om.treeAsTokens(results),
new TypeReference<Set<V>>() {});
在这种情况下,在哪里并且V
是一个.User
results
Array
在我添加接口之前,这个类和其他几个类的反序列化工作正常Identifiable<T>
,它们都因同样的异常而中断。
这不是一个abstract
类,每个方法都实现了。我想我已经把@JsonIgnore
适用的所有地方都放了。
我仍然得到那个异常,不知道如何解决它。
我有一种感觉,@JsonTypeInfo
注释中有一些东西可以解决这个问题,但是示例和 javadoc 并不是为不知道何时或如何使用注释的人编写的。