не может десериализовать из значения объекта (без создателя на основе делегатов или свойств) даже при наличии конструктора по умолчанию - PullRequest
0 голосов
/ 08 октября 2018

У меня есть класс, который выглядит как

class MyClass {
    private byte[] payload;

    public MyClass(){}

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

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

}

Я использую Джексона, так что сериализуйте, а затем десериализуйте.Сериализация работает нормально, но во время десериализации я получаю это сообщение об ошибке -

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

Я читал об этой проблеме в Интернете и наткнулся на несколько текстов, рекомендующих иметь конструктор по умолчанию или конструктор с @JsonCreatorаннотаций.Я попытался добавить оба, но все еще получаю это исключение.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 26 августа 2019

РЕДАКТИРОВАТЬ:

Я только что нашел гораздо лучшее решение, добавьте ParanamerModule в ObjectMapper:

mapper.registerModule(new ParanamerModule());

Maven:

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

Преимущество перед ParameterNamesModule заключается в том, что классы не нужно компилировать с аргументом -parameters.

ENDРЕДАКТИРОВАТЬ

С помощью 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;
    }
}
...