-4

我有一个带注释的类,它实现了一个带有一个名为通用的只读属性的接口,因此我可以在程序的其他部分中.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是一个.UserresultsArray

在我添加接口之前,这个类和其他几个类的反序列化工作正常Identifiable<T>,它们都因同样的异常而中断。

这不是一个abstract类,每个方法都实现了。我想我已经把@JsonIgnore适用的所有地方都放了。

我仍然得到那个异常,不知道如何解决它。

我有一种感觉,@JsonTypeInfo注释中有一些东西可以解决这个问题,但是示例和 javadoc 并不是为不知道何时或如何使用注释的人编写的。

我错过了什么?

4

1 回答 1

2

您正在尝试将 JSON 绑定到 type 的对象Identifiable而不是 type 的对象User,它不起作用,因为它Identifiable是一个接口。问题不在注释中,而是在您进行绑定的地方。

于 2017-09-21T17:24:13.087 回答