即使存在默认构造函数,也无法从对象值反序列化(没有基于委托或属性的创建者)

新手上路,请多包涵

我有一堂课,看起来像

class MyClass {
    private byte[] payload;

    public MyClass(){}

    @JsonCreator
    public MyClass(@JsonProperty("payload") final byte[] payload) {
        this.payload = payload;
    }

    public byte[] getPayload() {
        return this.payload;
    }

}

我正在使用 Jackson 进行序列化然后反序列化。序列化工作正常,但在反序列化期间,我收到此错误消息 -

 Cannot construct instance of `mypackage.MyClass` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

我在网上阅读了有关此问题的信息,并遇到了几篇建议使用默认构造函数或带有 @JsonCreator 注释的构造函数的文本。我尝试同时添加两者,但仍然出现该异常。我在这里错过了什么?

原文由 krackoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

编辑:

我刚刚找到了一个更好的解决方案,将 ParanamerModule 添加到 ObjectMapper

 mapper.registerModule(new ParanamerModule());

行家:

 <dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-paranamer</artifactId>
    <version>${jackson.version}</version>
</dependency>

相对于 ParameterNamesModule 的优势似乎是不需要使用 -parameters 参数编译类。

结束编辑


在 Jackson 2.9.9 中,我尝试反序列化这个简单的 POJO 并遇到了同样的异常,添加默认构造函数解决了这个问题:

POJO:

 public class Operator {

    private String operator;

    public Operator(String operator) {
        this.operator = operator;
    }

    public String getOperator() {
        return operator;
    }
}

ObjectMapper 和序列化/反序列化:

 ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.ANY);

String value = mapper.writeValueAsString(new Operator("test"));
Operator result = mapper.readValue(value, Operator.class);

JSON:

 {"operator":"test"}

例外:

 com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot construct instance of `...Operator` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{"operator":"test"}"; line: 1, column: 2]

解决方案(使用默认构造函数的 POJO):

 public class Operator {

    private String operator;

    private Operator() {
    }

    public Operator(String operator) {
        this();
        this.operator = operator;
    }

    public String getOperator() {
        return operator;
    }
}

原文由 flavio.donze 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题