РЕДАКТИРОВАТЬ:
Я только что нашел гораздо лучшее решение, добавьте 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;
}
}