当前位置: 首页 > 知识库问答 >
问题:

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

符懿轩
2023-03-14

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

我将JSR 107缓存注释CDI参考实现与Ehcache一起使用。

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

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

但是,当涉及可选返回值时,我无法使JCache/Ehcache清楚地使用我的自定义序列化程序和复制程序。我试着把ehcache放进去。xml在JBoss EAP 6.4.0的类路径上(使用JBoss模块),我尝试放置ehcache。xml在Maven模块的resources文件夹中,但它们显然被忽略了。即使我使这些XML无效,我也不会得到任何错误。

我希望避免创建CacheManager,即我们自己的ehcache。xml配置文件,因为此时我必须创建缓存。我不想要这个。我希望缓存由缓存注释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

粘贴有问题的缓存/缓存管理器的配置;

<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

提供JDK和操作系统版本可能也很有用。

  • Java SDK 1.8更新65
  • JBoss EAP 6.4.0
  • Windows 10

共有1个答案

岳良策
2023-03-14

从我对CDI的模糊理解来看,把它放在src/main/resources中应该行得通。你确定它最终会出现在你的罐子/战争中吗?

 类似资料:
  • 我们的Thorntail(2.4.0.Final)webapp使用Infinispan作为JCache(JSR-107)提供商。除了JCache的属性(如按值存储选项)之外,我们还想修改Infinispan特定的属性(如默认获取超时)。 我们当前的解决方案不起作用。以下是我们迄今为止所做的尝试。 定义: 然后下面的类使用上面的配置: 接口定义为: 下面是我们如何使用JCache API配置缓存:

  • 我得到了。了解调用相同的反序列化器。是否有一种方法可以在custome反序列化器中使用或?

  • 我有一个lib枚举,如下所示: 我不能修改这个枚举。我需要从xml反序列化,如下所示: 我知道如何创建和使用混搭与杰克逊。但是如何告诉杰克逊使用外部函数进行反序列化呢?

  • 我想使用Spring和自定义实现来转换来自Spring XML配置的值。 配置如下所示: 转换器按预期注入方法,以便正确初始化。但是无法执行xml配置中参数的转换。错误消息为: org.springframework.beans.factory.unsatisfiedDependencyException:在通过SAX inputsource加载的资源中创建名为“A1”的bean时出错:未满足的依

  • ehcache-jcache 是 ehcache 对 JCache 标准 API (JSR107) 的实现。

  • 但现在的目标是只检索该URL下的最新事务,因为我不想序列化整个数据库表。所以我写了一个控制器: 当我现在尝试访问http://localhost:8080/transactions时,有一个 因为用户和帐户之间的循环引用。当我通过向用户中的帐户列表添加@JSONBackReference注释来解决这个问题时,我可以检索事务列表,但只能使用以下“经典”格式: