У меня есть следующая проблема: с Jackson 2 этот код работает «как есть», но я не могу найти способ заставить его работать с Jackson 3, так как Джексон не обнаруживает поле content.
Чего мне не хватает, чтобы это сделать работает?
Пример кода (для удобства можно запустить через JShell IDE):
Код: Выделить всё
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.json.JsonMapper;
import java.io.Serializable;
import java.util.*;
abstract class BaseMessage {
protected UUID id;
protected final Map content;
// And other fields…
protected BaseMessage() {
id = UUID.randomUUID();
content = new HashMap();
}
public void addContent(final String key, final T value) {
content.put(key, value);
}
public void addContent(final Map contentToAdd) {
content.putAll(contentToAdd);
}
public void overrideContent(final Map newContent) {
content.clear();
content.putAll(newContent);
}
public void setId(final UUID id) {
this.id = id;
}
public UUID getId() {
return id;
}
public Map getContent() {
return content;
}
}
class ClientMessage extends BaseMessage {
private String upn;
// And other fields and methods…
public void setUpn(final String upn) {
this.upn = upn;
}
@Override
public String toString() {
return "ClientMessage{" + "upn='" + upn + "', id=" + id + ", content=" + content + '}';
}
}
final String jsonMessage = """
{
"id": "00000000-0000-0000-0000-000000000000",
"content": {
"test": true,
"prod": false,
"demo": "Demonstration"
},
"upn": "nemo@exemple.org"
}""";
// I do enable voluntarily the `FAIL_ON_UNKNOWN_PROPERTIES` to highlight the problem with Jackson 3+.
JsonMapper.builder()
.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
// ↓ Added as otherwise it’s included in the error message, but it doesn’t help anyway…
.enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION
.build()
.readValue(jdonMessage, ClientMessage.class);
Нераспознанное свойство «content» (класс ClientMessage), не помеченное как игнорируемое (2 известных свойства: «id», «upn»)
в [Источник: (String)"{
"id": "00000000-0000-0000-0000-000000000000",
"content": {
"test": true,
"prod": false,
"demo": "Демонстрация"
},
"upn": "nemo@exemple.org"
}"; строка: 3, столбец: 15] (через цепочку ссылок: ClientMessage["content"])
Jackson 2 (частичная версия):
Код: Выделить всё
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
// […]
new ObjectMapper()
.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.readValue(jsonMessage, ClientMessage.class)
[…] = ClientMessage{upn='nemo@exemple.org', id=00000000-0000-0000-0000-000000000000, content={test=true, prod=false, demo=Demonstration}}