Как я могу настроить пользовательские сериализаторы / копиры в XML для JSR-107 (JCache) с Ehcache?

У меня есть вопрос относительно конфигурации XML JCache / Ehcache.

Я использую Реализацию Реализации CDI Аннотаций JSR 107 вместе с Ehcache.

Я хочу аннотировать конкретные методы с помощью @CacheResult, чтобы результаты этих методов были кэшированы в кеше, созданном для этого конкретного метода. В нашем случае эти методы имеют значение Optional в качестве возвращаемого значения, и, как вы, вероятно, знаете, экземпляры Optional не являются сериализуемыми и поэтому не могут быть кэшированы по умолчанию. Используемые по умолчанию SerializingCopier и PlainJavaSerializer терпят неудачу на этом.

Чтобы решить эту проблему, я реализовал наши собственные пользовательские OptionalSerializer и OptionalCopier, чтобы иметь возможность обрабатывать необязательные значения.

Но я не в состоянии сделать JCache / Ehcache понятным для использования моего пользовательского Serializer и Copier, когда речь идет о необязательных возвращаемых значениях. Я попытался поместить 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

1 ответ

Из моего смутного понимания CDI, говоря об этом src/main/resources должно сработать. Вы уверены, что это заканчивается в вашей банке / войне?

Другие вопросы по тегам