我有一个带注释的类,它实现了一个带有名为.id()
的只读属性的接口,这个属性是通用的,所以我可以在不同类型的 id 中提取该计划的其他部分。
杰克逊应该忽略整个界面。但我收到以下错误消息:
java.util.concurrent.ExecutionException
:com.fasterxml.jackson.databind.exc.InvalidDefinitionException
:不能 构造my.company.Identifiable
的实例(没有创作者, 像默认构造,存在):抽象类型需要 映射到具体类型,具有自定义反序列化器或包含 其他类型信息在[来源:UNKNOWN; line:-1,column: -1](通过参考链:java.util.HashSet[0]
)
在搜索该异常以及Google的前两页时,我尝试了此处找到的所有解决方案。他们都没有解决我遇到的确切问题,而且我无法为他们中的任何一个解决我的具体问题的解决方案,缺少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不是为那些不知道何时或如何使用注释的人编写的。
答案 0 :(得分:1)
您正在尝试将JSON绑定到类型为Identifiable
的对象而不是User
类型的对象,但它不起作用,因为Identifiable
是一个接口。问题不在于您正在进行绑定的注释中。