未发生将Hazel cast IMDG字符串转换为HazelcastJsonValue的操作。
发布语句-将json存储为HazelCast IMDG中的字符串格式。使用下面的HazelcastJsonValue ..Getting检索异常
请帮助解决此问题。
如果HazelcastJsonValue对象存储在hazelcast IMDG..起作用了。但String to HazelcastJsonValue不起作用。获取以下异常:
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;
}发布于 2019-08-27 14:23:37
您将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) {
}
}https://stackoverflow.com/questions/57588681
复制相似问题