我有一个关于JCache / Ehcache XML配置的问题。
我正在使用JSR 107缓存注释CDI参考实现和Ehcache。
我想使用@CacheResult注释特定方法,以便将这些方法的结果缓存在为该特定方法生成的缓存中。 在我们的示例中,这些方法将Optional作为其返回值,并且您可能知道,Optional实例不是Serializable,因此默认情况下不能缓存。 默认情况下使用SerializingCopier和PlainJavaSerializer失败。
要解决这个问题,我已经实现了我们自己的自定义OptionalSerializer和OptionalCopier,以便能够处理可选值。
但是当我遇到可选的返回值时,我无法使JCache / Ehcache清楚地使用我的自定义Serializer和Copier。 我尝试将ehcache.xml放在JBoss EAP 6.4.0的类路径上(使用JBoss模块),我尝试将ehcache.xml放在Maven模块的resources文件夹中,但它们只是被忽略了。 即使我使这些XML无效,我也不会收到任何错误。
我想避免创建一个CacheManager,以编程方式引用我们自己的ehcache.xml配置文件,因为那时我必须创建缓存。我不想要这个。 我希望缓存注释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);
提供JDK和OS版本也许有用。
答案 0 :(得分:0)
根据我对CDI的模糊理解,将其放入src/main/resources
应该有效。你确定它最终会出现在你的罐子/战争中吗?