0

あなたの専門知識が必要です:)

サービスのメソッド呼び出しを認証する必要があるアプリケーションに取り組んでいます。つまり、ユーザー名を含むキーを使用して各メソッド呼び出しをキャッシュする必要があります (権限のないユーザーが、権限のあるユーザーによってキャッシュされた情報を取得できないようにするため)。

パーソナライズされた KeyGenerator を使用すると、すべて正常に機能します。

私のキーの例: username:USERNAME.appVersion:VERSION.METHOD.PARAM1.etc

しかし、ある場所で、国別コンテンツを取得するメソッドを取得しました。これは各ユーザーで同じです。そして、このコンテンツを要求する各ユーザーのキャッシュ キーを回避したいと考えています。

例: appVersion:VERSION.METHOD.PARAM1.etc

@Cacheable アノテーションを配置するときに、新しいパラメーターを設定する方法はありますか? キー ジェネレーターはそれをキャッチし、キャッシュ キー名の前にユーザー情報を付ける必要があるかどうかを知ることができます。

ご協力いただきありがとうございます :)

気をつけて

4

2 に答える 2

1

snicol さん、ありがとうございます。

Spring 4.1 を待って、私のチームと私はカスタム @SharedCache アノテーションを使用することにしました。

誰かが同じ状況にある場合に役立ついくつかのコード サンプルを次に示します。

  • 既存のカスタム GenericKeyGenerator が与えられた場合 (彼は、キャッシュされたメソッド呼び出しごとにカスタム キャッシュ キーを作成しています)

  • 新しいカスタム AuthenticatedGenericKeyGenerator があります。これは GenericKeyGenerator から継承され、キャッシュ キーの前にユーザー情報を追加するだけです。

アプリケーションはデフォルトで AuthenticatedGenericKeyGenerator を使用するようになりました:

<cache:annotation-driven key-generator="keyGenerator"/>

<bean id="keyGenerator" class="your.package.AuthenticatedGenericKeyGenerator" />

AuthenticatedGenericKeyGenerator.java の詳細:

public class AuthenticatedGenericKeyGenerator extends GenericKeyGenerator {

    public AuthenticatedGenericKeyGenerator() {

        super(...);
    }

    @Override
    public Object generate(final Object target, final Method method, final Object... params) {

        String cacheKey = super.generate(target, method, params).toString();

        if(!method.isAnnotationPresent(SharedCache.class)) {

            cacheKey =  "user:" + some user information + "." + cacheKey;
        }

        return cacheKey;
    }

}

カスタム @SharedCache アノテーション:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SharedCache {

}

キャッシュキーを共有し、一意にしないようにする場合 (たとえば、ユーザー ID を使用) は、@Cacheable メソッドに追加の @SharedCache でアノテーションを付けるだけです。

于 2014-04-01T22:04:19.670 に答える
1

「新しいパラメーターを設定する」ということで、あなたが何を言っているのかよくわかりません。そのパラメータはどこかから来るはずですよね?

KeyGeneratorMethod、実際のインスタンス、およびメソッドの引数にアクセスできます。Spring 4.1 から利用可能になるKeyGeneratorこの特定のキャッシュ操作に固有のものを用意したい場合がありますが、それまでの間は、メソッドに基づいて適切なインスタンスを呼び出す複合を実装するか、たとえば、注釈を使用できます。フラグを立てるために作成しました。KeyGenerator

于 2014-03-20T23:25:50.553 に答える