2017-08-30 2 views
0

私はJCache/Ehcache XML設定に関する質問があります。EhcacheでJSR-107(JCache)のXMLでカスタムシリアライザ/コピーを設定するにはどうすればよいですか?

JSR 107 Cache Annotations CDIリファレンス実装をEhcacheとともに使用しています。

@CacheResultで特定のメソッドに注釈を付けるので、これらのメソッドの結果はその特定のメソッドに対して生成されたキャッシュにキャッシュされます。 この例では、これらのメソッドは戻り値としてOptionalを持ちます。おそらく分かっているように、OptionalインスタンスはSerializableではないため、デフォルトではキャッシュできません。 デフォルトで使用されているSerializingCopierとPlainJavaSerializerはこれを失敗します。

これを解決するために、オプションの値を処理できるように独自のカスタムOptionalSerializerとOptionalCopierを実装しました。

しかし、JCache/Ehcacheでカスタムシリアライザとコピーを使用することができません。オプションの戻り値があります。 JBoss EAP 6.4.0(JBossモジュールを使用)のクラスパスにehcache.xmlを入れてみましたが、Mavenモジュールのresourcesフォルダにehcache.xmlを置こうとしましたが、無視されました。 これらのXMLを無効にしても、エラーは発生しません。

私はキャッシュを作成しなければならないので、私自身のehcache.xml構成ファイルをプログラムで参照して、CacheManagerを作成しないようにしたいと思います。私はこれを望んでいない。 Cache Annotations CDI CacheResultInterceptorでキャッシュを作成したいのですが、自分のCacheManagerを作成するメソッドをオーバーライドするオプションがないようです...

私は何をすべきか知っていますかこの問題を解決するには? 提供されたインターセプタを使用し、特定の戻り値の型にカスタムシリアライザとコピー機を使用する必要があることを指定するXML構成を使用します。

beans.xmlの:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
    <interceptors> 
    <class>org.jsr107.ri.annotations.cdi.CacheResultInterceptor</class> 
    <class>org.jsr107.ri.annotations.cdi.CachePutInterceptor</class> 
    <class>org.jsr107.ri.annotations.cdi.CacheRemoveEntryInterceptor</class> 
    <class>org.jsr107.ri.annotations.cdi.CacheRemoveAllInterceptor</class> 
    </interceptors> 
</beans> 

例方法:

@CacheResult 
public Optional<User> findUser(String username) { 
    return userDao.findUser(user); 
} 

現在使用しているEhcacheのどのバージョン。 Ehcache 3.4.0

問題が発生しているキャッシュ/キャッシュマネージャの設定を貼り付けます。

<ehcache:config xmlns:ehcache="http://www.ehcache.org/v3" 
       xmlns:jcache="http://www.ehcache.org/v3/jsr107"> 

    <ehcache:service> 
     <jcache:defaults default-template="defaultTemplate"/> 
    </ehcache:service> 

    <ehcache:cache-template name="defaultTemplate"> 
     <ehcache:value-type 
       serializer="be.post.min.client.cache.OptionalSerializer" 
       copier="be.post.min.client.cache.OptionalCopier">java.util.Optional</ehcache:value-type> 
    </ehcache:cache-template> 

    <ehcache:default-serializers> 
     <ehcache:serializer type="java.util.Optional">be.post.min.client.cache.OptionalSerializer</ehcache:serializer> 
    </ehcache:default-serializers> 
    <ehcache:default-copiers> 
     <ehcache:copier type="java.util.Optional">be.post.min.client.cache.OptionalCopier</ehcache:copier> 
    </ehcache:default-copiers> 

</ehcache:config> 

Ehcacheを使用する他のライブラリまたはフレームワークの名前とバージョン(たとえば、Hibernate)を追加します。

  • のJava EE 6
  • EJB 3.xの
  • CDI 1.xの
  • JCacheの1.0.0(JSR 107)
  • JSR 107キャッシュ注釈CDI RI 1.0.0

JDKとOSのバージョンを提供すると便利かもしれません。

  • のJava SDK 1.8アップデート65
  • のJBoss EAP 6.4.0
  • のWindows 10

答えて

0

CDIの私の漠然とした理解から、src/main/resourcesにそれを置くことは動作するはずです。あなたはそれがあなたのjar/warで終わると確信していますか?

+0

こんにちはアンリ、 はい、ehcache.xmlは、私のMavenモジュールのJARファイルのルートの下にあります。 –

関連する問題