2017-08-30 139 views
0

我有一个关于JCache/Ehcache XML配置的问题。如何使用Ehcache为JSR-107(JCache)在XML中配置自定义序列化器/复制器?

我正在使用JSR 107缓存注释CDI参考实现和Ehcache一起使用。

我想用@CacheResult注解特定的方法,以便这些方法的结果将被缓存在为该特定方法生成的缓存中。 在我们的例子中,这些方法的返回值是可选的,正如您可能知道的那样,Optional实例不是Serializable,因此默认情况下不能被缓存。 默认使用的SerializingCopier和PlainJavaSerializer在此失败。

为了解决这个问题,我实现了自己的自定义OptionalSerializer和OptionalCopier,以便能够处理可选值。

但是,我无法清楚地使JCache/Ehcache使用我的自定义序列化器和复印机时它可选返回值。 我试着把ehcache.xml放在JBoss EAP 6.4.0的类路径上(使用JBoss模块),我试着把ehcache.xml放到Maven模块的资源文件夹中,但它们只是被明显忽略。 即使我使这些XML无效,我也不会收到任何错误。

我想避免创建一个CacheManager,以编程方式引用我们自己的ehcache.xml配置文件,因为那时我必须创建缓存。我不想要这个。 我希望通过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

粘贴您遇到问题的Cache/CacheManager的配置;

<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

嗨Henri, 是的,ehcache.xml存在于我的Maven模块的JAR文件的根目录下。 –

相关问题