3

I'm trying to map a Resource class which has a Map field using Data JDBC. Here is simplified entity:

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

I don't want a separate table for props, just a single column of type string or may be jsonb for postgres.

I did register converters for the map type like this:

@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 "";
        }
    }
}

Inserts are working fine but a findAll query on the repository throws org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.String!

Jens Schauder
  • 77,657
  • 34
  • 181
  • 348
Bahadır Yağan
  • 5,577
  • 3
  • 35
  • 39

1 Answers1

2

Set, List and Map get special treatment in Spring Data JDBC. I'm kind of surprised persisting the Map via a WritingConverter actually works.

I recommend to replace the Map with a custom type which probably wraps the Map. This way any special handling of maps won't kick in.

Of course raising this as a feature request on https://jira.spring.io/browse/DATAJDBC is also always an option.

Jens Schauder
  • 77,657
  • 34
  • 181
  • 348