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

nis*_*ant 8 java serialization jackson deserialization

我有一堂课,看起来像

class MyClass {
    private byte[] payload;

    public MyClass(){}

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

cod*_*oda 13

我收到此错误,我尝试了https://newbedev.com/no-creators-like-default-construct-exist-cannot-deserialize-from-object-value-no-delegate-or-property-based-creator

基本都添加了

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
Run Code Online (Sandbox Code Playgroud)

装饰器,它对我有用。


fla*_*nze 12

编辑:

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

mapper.registerModule(new ParanamerModule());
Run Code Online (Sandbox Code Playgroud)

马文:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-paranamer</artifactId>
    <version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

JSON:

{"operator":"test"}
Run Code Online (Sandbox Code Playgroud)

例外:

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]
Run Code Online (Sandbox Code Playgroud)

解决方案(具有默认构造函数的 POJO):

public class Operator {

    private String operator;

    private Operator() {
    }

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

    public String getOperator() {
        return operator;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你的解决方案是因为杰克逊而禁止最终属性。紧急。 (5认同)

And*_*mer 11

我观察到了同样的问题。我的问题是由我使用错误的JsonCreator 类型引起的。我错误地使用了org.codehaus.jackson.annotate.JsonCreator,但应该使用com.fasterxml.jackson.annotation.JsonCreator代替。


小智 8

在您的子类对象中添加默认构造函数:

public NameOfClass() {
    super();
}
Run Code Online (Sandbox Code Playgroud)

  • “@Data”(添加了“@RequiredArgsConstructor”)确实还不够。我必须使该属性成为非“final”并添加“@NoArgsConstructor” (3认同)

ohr*_*yan 5

我遇到了这个序列化和反序列化kotlin data classes。我所要做的就是为我的属性添加默认值,然后读取有效的值。

data class DataClass(
  val key: String = "",    //  adding these default 
  val value: String = ""   //  values worked
)
Run Code Online (Sandbox Code Playgroud)

如果没有= "",我会收到错误:

Cannot construct instance of `com.xxx.DataClass` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Run Code Online (Sandbox Code Playgroud)