如何使用Ehcache为JSR-107(JCache)配置XML的自定义序列化器/复制器?

时间:2017-08-30 10:37:44

标签: ehcache jcache jsr107

我有一个关于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);

  • 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 update 65
  • JBoss EAP 6.4.0
  • Windows 10

1 个答案:

答案 0 :(得分:0)

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