Я использую Postgres в качестве источника данных и создал собственный преобразователь Spring для свойства, которое содержит список моих пользовательских объектов:
@Slf4j
@WritingConverter
@AllArgsConstructor
public class CustomObjectListToStringConverter implements Converter<List<CustomObject>, String> {
@Override
public String convert(@Nonnull List<CustomObject> source) {
try {
return objectMapper.writeValueAsString(source);
} catch (JsonProcessingException e) {
log.error("Error occurred while serializing list of CustomObject to JSON.", e);
}
return "[]";
}
}
Преобразование проходит гладко, но IllegalArgumentException
поднимается в getArrayType
методе класса PostgresArrayColumns
, потому что мой пользовательский тип не является простым типом.
Есть ли способ обойти эту охрану для какого-то свойства?
В настоящее время невозможно переопределить, потому что DatabaseClient
рассматривает значения типа коллекции как значения для полей массива Postgres. Отправьте заявку по адресу https://github.com/spring-projects/spring-data-r2dbc/, чтобы устранить проблему.
Спасибо за ответ. На данный момент я создал класс, который содержит список объектов, и создал для него собственный конвертер, а также открыл вопрос на Github.
@NikolaB, я не могу найти проблему на Github, не могли бы вы добавить ссылку?
@QwertZuiopü - Нужна помощь в конвертере клиентов. Не могли бы вы взглянуть на этот пост - stackoverflow.com/questions/70584887/…
Он не поддерживается намеренно на основе документации.
Please note that converters get applied on singular properties. Collection properties (e.g. Collection) are iterated and converted element-wise. Collection converters (e.g. Converter<List>, OutboundRow) are not supported.
Источник: ссылка на сопоставление spring-data-r2dbc
Решение:
Создайте класс-оболочку (сложный тип) следующим образом:
class CustomObjectList {
List<CustomObject> customObjects;
}
Затем вы применяете конвертер Converter<CustomObjectList, String>
и наоборот.
public class CustomObjectListToStringConverter implements Converter<CustomObjectList, String> {
Обходной путь кажется правильным, но я не думаю, что наблюдаемое поведение является преднамеренным. Насколько я понимаю документацию, преобразователь для пользовательского типа (то есть Converter<CustomObject,String>
) должен применяться поэлементно к элементам свойства List<CustomObject>
.
@magiccrafter - Ищу помощь в конвертере клиентов. Не могли бы вы взглянуть на этот пост - stackoverflow.com/questions/70584887/…
Нужна помощь в клиент конвертер. Не могли бы вы взглянуть на этот пост - stackoverflow.com/questions/70584887/…