2012-08-12 27 views
0

我有一個基類,這是一了Riak實體,以及延伸BaseEntity一些派生類。 BaseEntity有一個名爲Identifier的字段,它被註釋爲@RiakKey。避免在BaseEntity RiakKey的複製和派生類

,但顯然這是不足夠多。看來,我必須有標識字段,在每個派生類的@RuiakKey anotation,否則我得到這個異常:在com.basho.riak

com.basho.riak.client.convert.NoKeySpecifedException .client.bucket.DefaultBucket.fetch(DefaultBucket.java:535) at com.att.cso.omss.datastore.riak.controllers.RiakBaseController.isEntityExist(RiakBaseController.java:130) at com.att.cso.omss .datastore.riak.controllers.RiakBaseController.createEntity(RiakBaseController.java:94) at com.att.cso.omss.datastore.riak.controllers.RiakBaseController.createServiceProvider(RiakBaseController.java:234) at com.att.cso .omss.datastore.riak.App.serviceProviderTests(AP p.java:62) 在com.att.cso.omss.datastore.riak.App.main(App.java:38)

所以,我目前的實現看起來像這樣(標識符字段重複):

公共類BaseEntity {

@RiakKey @JsonProperty( 「ID」) 保護字符串標識符;

public String getIdentifier() { 
    return identifier; 
} 

public void setIdentifier(String identifier) { 
    this.identifier = identifier; 
} 

。 。 。

公共類服務擴展BaseEntity {

@RiakKey 
@JsonProperty("Id") 
protected String identifier; 

public String getIdentifier() { 
    return identifier; 
} 

public void setIdentifier(String identifier) { 
    this.identifier = identifier; 
} 

是有辦法避免這種重複?

回答

1

已更新:感謝某人看到此問題的貢獻,現在將在1.0.7客戶端版本中支持此功能。請參閱:https://github.com/basho/riak-java-client/pull/180

原來的答案:

簡短的回答:沒有,有沒有辦法解決它當前。

原因是com.basho.riak.client.convert.reflect.AnnotationScanner類,它是如何尋找這些註解,而我們允許領域的作用域是。

它採用Class.getDeclaredFields()僅獲取類顯式聲明的領域,而不是繼承的。這樣做的原因是,它得到private和protected成員,而Class.getFields()會得到繼承者,但只有當他們被宣佈在父類public。解決此

一個簡單的辦法是遞歸掃描每個父類了繼承樹。由於我們如何緩存域對象的註釋字段,這隻會是一次打擊,並且可能不會太可怕。

如果您有興趣添加到客戶端,請隨時在github上打開問題(或代碼&自己提交,當然 - 我們始終感謝社區提交!) 。

+0

謝謝!你能看看這個問題嗎? http://stackoverflow.com/questions/11921245/riak-simple-searchmapreduce-throws-ioexception – 2012-08-14 08:27:52