首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hazelcast IMDG字符串到HazelcastJsonValue问题

Hazelcast IMDG字符串到HazelcastJsonValue问题
EN

Stack Overflow用户
提问于 2019-08-21 17:36:57
回答 1查看 441关注 0票数 0

未发生将Hazel cast IMDG字符串转换为HazelcastJsonValue的操作。

发布语句-将json存储为HazelCast IMDG中的字符串格式。使用下面的HazelcastJsonValue ..Getting检索异常

请帮助解决此问题。

如果HazelcastJsonValue对象存储在hazelcast IMDG..起作用了。但String to HazelcastJsonValue不起作用。获取以下异常:

代码语言:javascript
复制
Exception in thread "main" com.hazelcast.query.QueryException: java.lang.IllegalArgumentException: There is no suitable accessor for 'age' on class 'java.lang.String'
    at com.hazelcast.query.impl.getters.ReflectionHelper.createGetter(ReflectionHelper.java:171)
    at com.hazelcast.query.impl.getters.Extractors.instantiateGetter(Extractors.java:152)
    at com.hazelcast.query.impl.getters.Extractors.getGetter(Extractors.java:118)
    at com.hazelcast.query.impl.getters.Extractors.extract(Extractors.java:73) 
代码语言:javascript
复制
public static void main(String args[]) {

    HazelcastInstance instance = com.hazelcast.core.Hazelcast.newHazelcastInstance(config());
    String person1 = "{ \"name\": \"John\", \"age\": 35 }";
    String person2 = "{ \"name\": \"Jane\", \"age\": 24 }";
    String person3 = "{ \"name\": \"Trey\", \"age\": 17 }";
    //Storing as String
    IMap<Integer, String> idPersonMap = instance.getMap("jsonValues");
    idPersonMap.put(1, person1);
    idPersonMap.put(2, person2);
    idPersonMap.put(3, person3);

    //Retrieving as HazelcastJsonValue
    IMap<Integer, HazelcastJsonValue> idPersonMapRead =  instance.getMap("jsonValues");
    Collection<HazelcastJsonValue> peopleUnder21 = (Collection<HazelcastJsonValue>) idPersonMapRead.values(Predicates.lessThan("age", 50));
    System.out.println( "-------------------Result--------------------");
    System.out.println( peopleUnder21.stream().collect(Collectors.toList()));

}

 public static Config config(){
        Config config = new Config();
        config.setInstanceName("hazelcast-instance")
                .addMapConfig(
                        new MapConfig().setMetadataPolicy(MetadataPolicy.OFF)
                                .setName("configuration")
                                .setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
                                .setEvictionPolicy(EvictionPolicy.LRU)
                                .setTimeToLiveSeconds(-1));

        return config;
    }
EN

回答 1

Stack Overflow用户

发布于 2019-08-27 14:23:37

您将String实例放入IMap中。不要期望get操作返回HazelcastJsonValue实例。它将再次成为String

当你调用get方法时,它并不知道你的目标泛型类型。为了方便用户,Hazelcast没有返回原始类型,但它在底层进行了未经检查的转换。

如果您希望在put操作中实现自动值转换,则可以使用MapInterceptor,例如:

代码语言:javascript
复制
IMap<Integer, String> idPersonMap = instance.getMap("jsonValues");
idPersonMap.addInterceptor(new ConvertOnPutMapInterceptor());

    private static class ConvertOnPutMapInterceptor implements MapInterceptor {

        @Override
        public Object interceptGet(Object value) {
            return value;
        }

        @Override
        public void afterGet(Object value) {
        }

        @Override
        public Object interceptPut(Object oldValue, Object newValue) {
            return new HazelcastJsonValue((String) newValue);
        }

        @Override
        public void afterPut(Object value) {
        }

        @Override
        public Object interceptRemove(Object removedValue) {
            return null;
        }

        @Override
        public void afterRemove(Object value) {
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57588681

复制
相关文章

相似问题

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