gpt4 book ai didi

java - Hazelcast IMDG 字符串到 HazelcastJsonValue 问题

转载 作者:行者123 更新时间:2023-12-02 01:25:37 25 4
gpt4 key购买 nike

Hazel 将 IMDG 字符串转换为 HazelcastJsonValue 转换未发生。

问题声明 - 将 json 作为字符串格式存储在 HazelCast IMDG 中。使用 HazelcastJsonValue 检索..遇到异常

请帮忙解决问题。

如果HazelcastJsonValue对象存储在hazelcast IMDG中..它正在工作。但是 StringHazelcastJsonValue 不起作用。出现以下异常:

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)
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;
}

最佳答案

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

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

如果您想在 put 内进行自动值转换操作,您可以使用 MapInterceptor 例如:

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) {
}
}

关于java - Hazelcast IMDG 字符串到 HazelcastJsonValue 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com