Джексон 3 и финальная десериализация картыJAVA

Программисты JAVA общаются здесь
Anonymous
Джексон 3 и финальная десериализация карты

Сообщение Anonymous »

В корпоративном проекте я мигрирую с Spring 3.x на Spring 4.x, а также с Jackson 2.x на 3.x одновременно.
У меня есть следующая проблема: с 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)
Фактический (и ожидаемый для Jackson3+) результат:

[…] = ClientMessage{upn='nemo@exemple.org', id=00000000-0000-0000-0000-000000000000, content={test=true, prod=false, demo=Demonstration}}

Вернуться в «JAVA»