我在我的應用程序中使用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