避免在BaseEntity和派生类中复制RiakKey

时间:2012-08-12 08:59:34

标签: identifier riak java-client

我有一个基类,它是一个Riak实体,还有一些扩展BaseEntity的派生类。 BaseEntity有一个名为Identifier的字段,注释为@RiakKey。

但显然这是不应该的。看来我必须有Identifier字段,每个派生类都有@RuiakKey anotation,否则我得到这个例外:

  

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

所以,我当前的实现看起来像这样(标识符字段的重复):

  

公共类BaseEntity {

     

@RiakKey     @JsonProperty("标识&#34)       protected String identifier;

public String getIdentifier() {
    return identifier;
}

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

。 。

  

public class Service扩展了BaseEntity {

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

public String getIdentifier() {
    return identifier;
}

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

有没有办法避免这种重复?

1 个答案:

答案 0 :(得分:1)

更新:感谢看到此问题的人的贡献,现在将从1.0.7客户端版本开始支持此功能。请参阅:https://github.com/basho/riak-java-client/pull/180

原始答案:

简短的回答:不,目前还没有解决办法。

原因是com.basho.riak.client.convert.reflect.AnnotationScanner类,它如何查找这些注释,以及我们允许字段范围的内容。

它使用Class.getDeclaredFields(),它只获取在类中显式声明的字段,而不是继承的字段。这样做的原因是它获得了私有和受保护的成员,而Class.getFields()将获得继承的成员,但前提是它们在父类中被声明为public

解决这个问题的一个简单方法是递归扫描继承树中的每个父类。由于我们如何缓存域对象的注释字段,这只会是一次性命中,并且可能不会太糟糕。

如果您有兴趣添加到客户端,请随时在github上打开一个问题(或者代码&自己提交,当然 - 我们总是感谢社区提交!) 。