3

私たちのプロジェクトでは、キャッシングの目的で ehcache を使用しています。

import com.googlecode.ehcache.annotations.Cacheable;
// Other imports

@Component
public class Authenticator{
    @Cacheable(cacheName = "rest_client_authorized")
    public boolean isUserAuthorized(final String user, final String sessionId) {
        // Method code
    }
}

メソッドに入るとき、キャッシュインターセプターはありません。これまでに確認したこと:

  1. このメソッドはクラス内からではなく、外部から呼び出します。したがって、問題はプロキシをバイパスする内部呼び出しではありません。
  2. このクラスのインターフェイスを追加し、このクラスが呼び出されるインジェクションを、具象クラスの代わりにインターフェイス表現を使用するように変更しました。

アプリケーション コンテキストでキャッシュ マネージャーを次のように定義しました。

   <ehcache:annotation-driven cache-manager="ehCacheManager" />         
   <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
       <!-- use a share singleton CacheManager -->
       <property name="shared" value="true" />
   </bean>

キャッシュは次のように定義されます。

        <cache name="rest_client_authorized"
            eternal="false"
            maxElementsInMemory="50"
            overflowToDisk="false" diskPersistent="false"
            timeToIdleSeconds="0" timeToLiveSeconds="600"
            memoryStoreEvictionPolicy="LRU" />

Jconsole を使用してキャッシュ マネージャーをテストすると、キャッシュ *rest_auth_disabled* が存在し、空であることがわかります。

なぜこれが機能しないのかについてのアイデアは非常に高く評価されます。ありがとう!

更新 (以下のコメントからの集計) :

==========================================**

これは、私が提供したクラスと定義で問題なく動作する従来のコードです。ここで説明する方法は新しいものですが、クラスの残りの部分は過去に機能していました。そのため、何が変わったのかを理解するのに苦労しています。また、注釈を spring Cacheable に置き換えようとしましたが、まだ何もありません :/ おそらく、この新しいメソッドを呼び出すコードに依存します。これは、他のメソッドに使用したものとは異なる Spring Bean からのものです。しかし、私はまだ問題を見つけることができません。

また、以下の回答に従ってブール値ではなくブール値を返そうとしましたが、うまくいきませんでした。(@Autowire を使用して) Bean を注入する方法におそらく関連する新しいリードがあります。それが実際に当てはまる場合は更新されます。

4

4 に答える 4

3

この問題は、Springs が Bean をロードする順序に関係している可能性があります。Authenticator 宣言から @Autowire アノテーションを削除してみて、手動で自動配線を行ってください。何かのようなもの:

/**
 * Class that uses Authenticator
 */

 public class X {

    // Don't use @autowire here
    public Authenticator athenticator;

    public void doSomething() {
         manuallyAutowire();
    }

    public void manuallyAutowire() {
         if(authenticator == null) {
    authenticator = ApplicationContextUtils.getApplicationContext().
                            getBean(authenticator.class);
    }
}

どこ

@Component
public class ApplicationContextUtils implements ApplicationContextAware {

    private static ApplicationContext ctx;

    @Override
    public void setApplicationContext(final ApplicationContext appContext) 
                                          throws BeansException {
         ctx = appContext;

    }

    public static ApplicationContext getApplicationContext() {
        return ctx;
    }
}
于 2013-04-18T08:58:35.977 に答える
1

私はあなたがここで物事を混同していると思いますcom.googlecode.ehcache.annotations.Cacheable-Springsキャッシングのサポートが必要な場合は、実際に使用する必要がありますorg.springframework.cache.annotation.Cacheable。その後、キャッシング インターセプターが問題なく動作するはずです。

于 2013-04-10T13:19:44.680 に答える
1

@CacheableのパラメーターcacheNameの値は、アプリケーション コンテキストの<cache>宣言のname属性の値と同じである必要があります。

于 2013-04-10T12:53:35.493 に答える
1

私の知る限り、Spring Ehcache アノテーションは、戻りオブジェクトとしての両方のパラメーターに、プリミティブ型に欠けているメソッドequals()とメソッドを含めることを推奨しています。hashCode()

このフレームワークがプリミティブをラッパー バリアントに変換しているかどうかはわかりません (たとえばInteger、 またはBoolean)。Booleanプリミティブ型の代わりにラッパー バリアントを返してみて、それが機能するかどうかを確認してください。

私がよくわからないもう1つのことは、finalパラメーターを処理する方法(および処理するかどうか)です。最初のアイデアがうまくいかない場合は、final可能であればキーワードを削除してみて、うまくいくかどうかを確認してください。

于 2013-04-12T09:40:14.287 に答える