Предположим, у нас есть класс InstantMessage, который имеет абстрактный дочерний контент IMContent.
public class InstantMessage {
// other fields
private MessageType type;
private IMContent content;
}
public enum MessageType {
TEXT, IMAGE, VIDEO, PRODUCT, SHOPPING_ORDER, SYSTEM;
}
public abstract class IMContent {
public abstract String toText();
}
IMContent имеет множество реализаций, таких как IMTextContent, IMImageContent, что зависит от типа сообщения.
При использовании InstantMessage в @RequestBody и @RequestPart, Spring не может десериализовать IMContent.
Я пробовал несколько методов, но все они имеют некоторые очевидные недостатки.
Во-первых, я попробовал добавить @JsonDeserialize(using = IMContentDeserialzer.class) к содержимому, но для этого мне нужно вручную десериализовать другие поля, помимо содержимого. , что очень неудобно и легко забыть при добавлении другого поля. Я могу согласиться с тем, что я пишу десериализацию IMContent вручную, но не весь InstantMessage. Мне бы хотелось, чтобы был простой способ десериализации полей, не содержащих содержимого.
Моя вторая попытка заключалась в использовании @JsonTypeInfo и @JsonSubTypes, но, похоже, это потребовать от меня переместить тип из InstantMessage в IMContent. Это также неудобно, когда мне нужно напрямую получить доступ к типу из InstantMessage или просто напрямую получить доступ к текстовому содержимому. Например, если мне нужно выполнить поиск по текстовому содержимому, мне нужно свести содержимое в строку в базе данных, а когда я извлеку InstantMessage из базы данных, мне нужно снова напоминать содержимое.
У меня также есть обходные пути, такие как использование Map вместо IMContent, или десериализация контента в IMContent на лету, или создание абстрактного InstantMessage, но они есть Я думаю, это не элегантно.
Как проще всего решить эту проблему в данном случае?
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true
)
@JsonSubTypes({
@JsonSubTypes.Type(value = IMTextContent.class, name = "TEXT"),
@JsonSubTypes.Type(value = IMImageContent.class, name = "IMAGE"),
@JsonSubTypes.Type(value = IMProductContent.class, name = "PRODUCT"),
@JsonSubTypes.Type(value = IMShoppingOrderContent.class, name = "SHOPPING_ORDER"),
})
public abstract class IMContent {
public abstract String toText();
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-spring
Десериализовать абстрактный класс с помощью перечисления весной ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1735545362
Anonymous
Предположим, у нас есть класс InstantMessage, который имеет абстрактный дочерний контент IMContent.
public class InstantMessage {
// other fields
private MessageType type;
private IMContent content;
}
public enum MessageType {
TEXT, IMAGE, VIDEO, PRODUCT, SHOPPING_ORDER, SYSTEM;
}
public abstract class IMContent {
public abstract String toText();
}
IMContent имеет множество реализаций, таких как IMTextContent, IMImageContent, что зависит от типа сообщения.
При использовании InstantMessage в @RequestBody и @RequestPart, Spring не может десериализовать IMContent.
Я пробовал несколько методов, но все они имеют некоторые очевидные недостатки.
Во-первых, я попробовал добавить @JsonDeserialize(using = IMContentDeserialzer.class) к содержимому, но для этого мне нужно вручную десериализовать другие поля, помимо содержимого. , что очень неудобно и легко забыть при добавлении другого поля. Я могу согласиться с тем, что я пишу десериализацию IMContent вручную, но не весь InstantMessage. Мне бы хотелось, чтобы был простой способ десериализации полей, не содержащих содержимого.
Моя вторая попытка заключалась в использовании @JsonTypeInfo и @JsonSubTypes, но, похоже, это потребовать от меня переместить тип из InstantMessage в IMContent. Это также неудобно, когда мне нужно напрямую получить доступ к типу из InstantMessage или просто напрямую получить доступ к текстовому содержимому. Например, если мне нужно выполнить поиск по текстовому содержимому, мне нужно свести содержимое в строку в базе данных, а когда я извлеку InstantMessage из базы данных, мне нужно снова напоминать содержимое.
У меня также есть обходные пути, такие как использование Map вместо IMContent, или десериализация контента в IMContent на лету, или создание абстрактного InstantMessage, но они есть Я думаю, это не элегантно.
Как проще всего решить эту проблему в данном случае?
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true
)
@JsonSubTypes({
@JsonSubTypes.Type(value = IMTextContent.class, name = "TEXT"),
@JsonSubTypes.Type(value = IMImageContent.class, name = "IMAGE"),
@JsonSubTypes.Type(value = IMProductContent.class, name = "PRODUCT"),
@JsonSubTypes.Type(value = IMShoppingOrderContent.class, name = "SHOPPING_ORDER"),
})
public abstract class IMContent {
public abstract String toText();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79317001/deserialize-an-abstract-class-with-enum-in-spring[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия