Map‹String, String› отображение одного столбца в весенних данных jdbc

Я пытаюсь сопоставить класс Resource с полем Map, используя Data JDBC. Вот упрощенная сущность:

public class Resource {
    @Id
    private Long id;
    private Map<String, String> props;
}

Мне не нужна отдельная таблица для реквизита, просто один столбец типа string или может быть jsonb для postgres.

Я зарегистрировал преобразователи для типа карты следующим образом:

@Configuration
public class DataJdbcConfiguration extends AbstractJdbcConfiguration {

    @Override
    public JdbcCustomConversions jdbcCustomConversions() {
        return new JdbcCustomConversions(Arrays.asList(
                JsonToStringConverter.INSTANCE,
                StringToJsonConverter.INSTANCE)
        );
    }

    @ReadingConverter
    enum JsonToStringConverter implements Converter<String, Map<String, String>> {

        INSTANCE;

        @Override
        public Map<String, String> convert(String source) {
            try {
                return new ObjectMapper().readValue(source, new TypeReference<Map<String, String>>() {
                });
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    @WritingConverter
    enum StringToJsonConverter implements Converter<Map<String, String>, String> {
        INSTANCE;

        @Override
        public String convert(Map<String, String> source) {
            try {
                return new ObjectMapper().writeValueAsString(source);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return "";
        }
    }
}

Вставки работают нормально, но запрос findAll к репозиторию выдает org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.String!


person Bahadır Yağan    schedule 18.11.2019    source источник


Ответы (1)


Set, List и Map получают специальную обработку в Spring Data JDBC. Я немного удивлен, что сохранение Map через WritingConverter действительно работает.

Я рекомендую заменить карту на пользовательский тип, который, вероятно, является оберткой для Map. Таким образом, никакая специальная обработка карт не сработает.

Конечно, поднимая это как запрос функции на https://jira.spring.io/browse/DATAJDBC также всегда является опцией.

person Jens Schauder    schedule 18.11.2019