0

Riakエンティティである基本クラスと、BaseEntityを拡張するいくつかの派生クラスがあります。BaseEntityには、@RiakKeyとして注釈が付けられたIdentifierという名前のフィールドがあります。

しかし、どうやらこれは十分ではありません。各派生クラスに@RuiakKey注釈を付けたIdentifierフィールドが必要なようです。そうでない場合、次の例外が発生します。

com.bat.cso.omss.datastore.riak.controllers.RiakBaseController.isEntityExistのcom.basho.riak.client.bucket.DefaultBucket.fetch(DefaultBucket.java:535)のcom.basho.riak.client.convert.NoKeySpecifedException (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(App.java:62)at 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;
}

。。。

パブリッククラスServiceは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

これを回避する簡単な方法の1つは、継承ツリーの各親クラスを再帰的にスキャンすることです。ドメインオブジェクトの注釈付きフィールドをキャッシュする方法のため、これは1回限りのヒットであり、おそらくそれほどひどいことではありません。

これがクライアントに追加したいものである場合は、githubで問題を開いてください(または、もちろん、コードを作成して自分で送信してください。コミュニティからの送信には常に感謝しています!)。

于 2012-08-13T18:23:34.057 に答える