我有一个基类,它是一个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;
}
有没有办法避免这种重复?
答案 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上打开一个问题(或者代码&自己提交,当然 - 我们总是感谢社区提交!) 。