0

我有一个关于 JCache / Ehcache XML 配置的问题。

我将 JSR 107 Cache Annotations CDI Reference Implementation 与 Ehcache 一起使用。

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

为了解决这个问题,我实现了我们自己的自定义 OptionalSerializer 和 OptionalCopier 来处理 Optional 值。

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

我想避免创建 CacheManager,以编程方式引用我们自己的 ehcache.xml 配置文件,因为那时我必须创建缓存。我不想要这个。我希望缓存由 Cache Annotations CDI CacheResultInterceptor 创建,而且我似乎没有选项可以覆盖创建自己的 CacheManager 的方法...

有谁知道我应该怎么做才能解决这个问题?我只想使用提供的拦截器,并有一个 XML 配置,指定自定义序列化器和复制器将需要用于特定的返回类型。

豆类.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
  • 视窗 10
4

1 回答 1

0

根据我对 CDI 的模糊理解,将其放入src/main/resources应该可以。你确定它最终会出现在你的罐子/战争中吗?

于 2017-09-01T03:58:47.137 回答