1

我正在尝试使用 Data JDBC 映射具有 Map 字段的 Resource 类。这是简化的实体:

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

我不想要一个单独的道具表,只是一个字符串类型的列,或者可能是 postgres 的 jsonb。

我确实为这样的地图类型注册了转换器:

@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!

4

1 回答 1

2

SetListMap在 Spring Data JDBC 中得到特殊处理。我有点惊讶坚持Mapvia aWritingConverter确实有效。

我建议将 Map 替换为可能包含Map. 这样就不会对地图进行任何特殊处理。

当然,在https://jira.spring.io/browse/DATAJDBC上将此作为功能请求提出也是一种选择。

于 2019-11-18T10:01:09.933 回答