首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用自定义转换Spring-data-elasticsearch

如何使用自定义转换Spring-data-elasticsearch
EN

Stack Overflow用户
提问于 2020-07-23 05:44:00
回答 1查看 1.4K关注 0票数 2

我正在使用Elasticist 4.0.1。我有个领域

代码语言:javascript
复制
@Field(type = FieldType.Nested, index = false, includeInParent = true)
private Map<String, Map<String, List<City>>> province = new HashMap<>();

根据文档,我做了自定义转换。

代码语言:javascript
复制
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;
    }

当我执行这段代码时。

代码语言:javascript
复制
 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());
            }

        }

我犯了个错误

代码语言:javascript
复制
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]

..。

也许我做得不对。我注意到当我从弹性中接收数据时,数据被转换为Map。

如何正确使用零件4.0.1。我以前用过杰克逊。

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 16:36:09

我把这个地图分成了一个单独的类。

代码语言:javascript
复制
public class SomeHardMap {

   private Map<String, Map<String, ArrayList<TestClass>>> hardMap = new HashMap<>();
   /// Getter and Setter
........

Elasticsearch字段类

@Field(type = FieldType.Object)私有SomeHardMap someHardMap =新SomeHardMap();

当@Reading转换器完成时,省类将被解析为Map。我写这封信是为了做更多的地图。我没能做得漂亮

@写转换器静态类UserTaskEventToMap实现Converter {

代码语言:javascript
复制
    @Override
    public Object convert(SomeHardMap userTaskEvents) {


        Object obj = userTaskEvents;
        return obj;
    }

}

@Reading转换器静态类MapToUserTaskEvent实现Converter {

代码语言:javascript
复制
    @SneakyThrows
    @Override
    public SomeHardMap convert(Object stringObjectMap) {

        Map<String, Map<String, Map<String, ArrayList<Map<String, String>>>>> mamamia = (Map)stringObjectMap;

        Map<String, Map<String, ArrayList<TestClass>>> hardMapV = new HashMap<>();

        for (Map.Entry<String, Map<String, Map<String, ArrayList<Map<String, String>>>>> entryObj: mamamia.entrySet()) {

            for (Map.Entry<String, Map<String, ArrayList<Map<String, String>>>> entryMapHight: entryObj.getValue().entrySet()) {

                Map<String, ArrayList<TestClass>> hard1 = new HashMap<>();

                for (Map.Entry<String, ArrayList<Map<String, String>>> entryNextLevel: entryMapHight.getValue().entrySet()) {

                    ArrayList<TestClass> list = new ArrayList<>();

                    entryNextLevel.getValue().forEach(f -> list.add(mapClass(f)));


                    hard1.put(entryNextLevel.getKey(), list);
                }

                hardMapV.put(entryMapHight.getKey(), hard1);
            }
        }

        SomeHardMap hardMap = new SomeHardMap();
        hardMap.setHardMap(hardMapV);
        return hardMap;
    }

    private TestClass mapClass(Map<String, String> f) {
        TestClass testClass = new TestClass();
        for(Map.Entry<String, String> entry: f.entrySet()) {

            if (entry.getKey().equals("workPlace"))
                testClass.setWorkPlace(entry.getValue());
            else if (entry.getKey().equals("city"))
                testClass.setCity(entry.getValue());
            else if(entry.getKey().equals("nameJob"))
                testClass.setNameJob(entry.getValue());
        }

        return testClass;
    }
}

如果有人另有决定,你可以分享。如果有必要,我会在github上发布一个测试项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63047623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档