0

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

但显然这还不够。看来我必须有标识符字段,每个派生类中都有 @RuiakKey 注释,否则我会得到这个异常:

com.basho.riak.client.convert.NoKeySpecifedException 在 com.att.cso.omss.datastore.riak.controllers.RiakBaseController.isEntityExist 的 com.basho.riak.client.bucket.DefaultBucket.fetch(DefaultBucket.java:535) (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("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;
}

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

4

1 回答 1

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 上打开一个问题(当然,也可以自己编写代码并提交 - 我们总是感谢社区提交!)。

于 2012-08-13T18:23:34.057 回答