我在我的应用程序中使用Hazelcast作为共享地图。我的地图是这样的:自定义对象中的Hazelcast查询
Map<String, MyObject>
和MyObject
:
class MyObject implements Serializeble {
// Map FieldName -> FieldValue
Map<String, Object> myMap;
}
所以我想使用Hazelcast distributed query支持我的对象查询。我检查了Hazelcast使用获得的方法来检索对象的值,但对我来说,我没有一个get,而不是我想实现我自己的getField
像:
Object getField(String fieldName) {
return myMap[fieldName];
}
,并迫使Hazelcast调用这个方法。作为一种变通方法,我砍死Hazelcast代码中的类
/hazelcast/src/main/java/com/hazelcast/query/impl/ReflectionHelper.java
线使用CustomGetter 144:
if (localGetter == null) {
localGetter = new CustomFieldGetter(name, obj);
}
,在这里我CustomFieldGetter
类:
static class CustomFieldGetter extends Getter {
final Object value;
final Class type;
final String fieldName;
CustomFieldGetter(String fieldName, Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
super(null);
this.fieldName = fieldName;
this.value = obj.getClass().getMethod("getField", String.class).invoke(obj, fieldName);
this.type = value.getClass();
}
@Override
Object getValue(Object obj) throws Exception {
return value;
}
@Override
Class getReturnType() {
return type;
}
@Override
boolean isCacheable() {
return false;
}
@Override
public String toString() {
return "FieldGetter [parent=" + parent + ", field=" + fieldName + "]";
}
}
好凉,在重新编译Hazelcast之后,使用这个新的jar,我可以使用普通的sql来查询。但对于pagingQueries,我有一些错误。
所以我最后的问题是: 我想避免黑客Hazelcast代码(进一步更新)。 Hazelcast在这个问题上有一些支持吗?有没有其他解决方案来解决这个问题?
PS:我使用Hazelcast版本 - >hazelcast-3.3-RC3提前
感谢。
而不是发布到Stackoverflow这将是更有意义的创建一个pullrequest的补丁或在bugtracker中创建一个功能请求。我们不在网上搜索请求,什么不在github作为一个问题不存在作为一个请求:) 其实我不知道是否有意义添加类似的东西,如果你开始这个每个人来以不同的方式,类加载。 getters/setters是由bean规范定义的,如果你没有使用它们,那么很可能没有框架支持你的方式。 PS:为什么PP会造成问题,不知道:) – noctarius 2014-09-02 04:23:21
感谢您的建议。我也在Hazelcast ML中分享了这个链接。问题是,我们无法创建getter和setter,因为这些类是根据需要实时创建的(重新加载jvm不是此处的选项)。我无法创建拉请求,因为它对我的问题太过分了,在我们得到最佳方法之前,这只是一个姑息性解决方案。 无论如何,我很感激。 – Santiago 2014-09-02 13:24:18