如何使用Ehcache为JSR-107(JCache)在XML中配置自定义序列化器/复制器?
我有一个关于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
从我CDI的模糊认识,把它在src/main/resources
应该工作。你确定它结束在你的jar/war吗?
嗨Henri, 是的,ehcache.xml存在于我的Maven模块的JAR文件的根目录下。 –