I am using Elasticist 4.0.1. I have a field
@Field(type = FieldType.Nested, index = false, includeInParent = true)
private Map<String, Map<String, List<City>>> province = new HashMap<>();
According to the documentation, I did Custom Conversions.
public class ElasticConfig extends AbstractElasticsearchConfiguration {
@Bean
@Override
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration clientConfiguration
= ClientConfiguration.builder()
.connectedTo("0.0.0.0:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchRestTemplate(elasticsearchClient());
}
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
return new ElasticsearchCustomConversions(Arrays.asList(new ProvinceToMap(), new MapToProvince()));
}
@WritingConverter
static class ProvinceToMap implements Converter<Map<String, Map<String, ArrayList<City>>>, Map<String, Object>> {
@Override
public Map<String, Object> convert(Map<String, Map<String, ArrayList<City>>> userTaskEvents) {
HashMap<String, Object> target = new HashMap<>();
for(Map.Entry<String, Map<String, ArrayList<City>>> entry: userTaskEvents.entrySet()) {
target.put(entry.getKey(), entry.getValue());
}
return target;
}
}
@ReadingConverter
static class MapToProvince implements Converter<Map<String, Object>, Map<String, Map<String, ArrayList<City>>>> {
@Override
public Map<String, Map<String, ArrayList<City>>> convert(Map<String, Object> stringObjectMap) {
ObjectMapper oMapper = new ObjectMapper();
Map<String, Map<String, ArrayList<City>>> target = new HashMap<>();
for(Map.Entry<String, Object> entry: stringObjectMap.entrySet()) {
Map<String, ArrayList<Map<String, Object>>> event = oMapper.convertValue(entry.getValue(), Map.class);
target.put(entry.getKey(), conv);
}
return target;
}
When I execute this piece of code.
for(Map.Entry<String, Map<String, ArrayList<City>>> entry: userTaskEvents.entrySet()) {
target.put(entry.getKey(), entry.getValue());
for (Map.Entry<String, ArrayList<City>> aaa: entry.getValue().entrySet()) {
for (TestClass tt: aaa.getValue())
System.out.println(tt.getNameCity());
}
}
I get an error
java.lang.ClassCastException: java.util.HashMap cannot be cast to org.elasticsearch.example.model.City
at kz.elasticsearch.example.config.ElasticConfig$UserTaskEventToMap.convert(ElasticConfig.java:66) ~[classes/:na]
at kz.elasticsearch.example.config.ElasticConfig$UserTaskEventToMap.convert(ElasticConfig.java:54) ~[classes/:na]
...
Maybe I'm not doing it right. I noticed that when I receive data from elastic, the data is cast be as Map.
How to use the parts correctly 4.0.1. I've used Jackson before.