Jackson反序列化实现接口的对象并忽略接口属性

时间:2017-09-21 16:45:12

标签: java jackson jackson2 jackson-databind

我有一个带注释的类,它实现了一个带有名为.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>>() {});

在这种情况下,VUserresultsArray

在我添加Identifiable<T>界面之前,这个和其他几个类的反序列化工作正常,他们都破坏了同样的例外。

这不是abstract类,每个方法都已实现。我想我已尽可能地将@JsonIgnore放在适用的地方。

我仍然得到那个例外而且不知道如何解决它。

我觉得@JsonTypeInfo注释中有一些内容可能会解决这个问题,但是示例和javadoc不是为那些不知道何时或如何使用注释的人编写的。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

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