Как я могу настроить пользовательские сериализаторы / копиры в 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
должно сработать. Вы уверены, что это заканчивается в вашей банке / войне?