Хобрук: Ваш путь к мастерству в программировании

Infinispan-10.0.1.Final: Маршаллер не зарегистрирован для типа Java java.util.UUID

После обновления infinispan-jcache с 9.4.16.Final -> 10.0.1.Final я не могу использовать кеш из-за ошибки маршаллера.

См. https://infinispan.org/blog/.

Я хочу, чтобы он работал с javax.cache. *, Как в случае с v9.4.16.Final. Классы, связанные с infinispan, не используются.

В v10.0.1.Final я могу помещать и извлекать UUID из кеша. Но не работает, когда установлен CacheLoaderFactory.

Импорт

import javax.cache.Cache;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.Duration;
import javax.cache.expiry.ModifiedExpiryPolicy;
import javax.cache.integration.CacheLoader;
import javax.cache.integration.CacheLoaderException;

Код:

final var cachingProvider = Caching.getCachingProvider();
final var cacheManager = cachingProvider.getCacheManager();
final var config = new MutableConfiguration<String,UUID>();
config.setTypes( String.class, UUID.class );
config.setStoreByValue( false );
config.setExpiryPolicyFactory( ModifiedExpiryPolicy.factoryOf( Duration.FIVE_MINUTES ) );
config.setReadThrough( true );
config.setCacheLoaderFactory( () -> new CacheLoader<>() {
    @Override
    public UUID load(String key) throws CacheLoaderException {
        return UUID.randomUUID();
    }

    @Override
    public Map<String,UUID> loadAll(Iterable<? extends String> keys) throws CacheLoaderException {
        return null;
    }
} );

cache = cacheManager.createCache( UUIDCacheTest.class.getName(), config );

cache.get( "Dummy" ); // Throws exception

Исключение составляют:

Caused by: org.infinispan.persistence.spi.PersistenceException: org.infinispan.commons.marshall.MarshallingException: No marshaller registered for Java type java.util.UUID
    at org.infinispan.marshall.persistence.impl.MarshallableEntryImpl.marshall(MarshallableEntryImpl.java:211)
    at org.infinispan.marshall.persistence.impl.MarshallableEntryImpl.<init>(MarshallableEntryImpl.java:37)
    at org.infinispan.marshall.persistence.impl.MarshalledEntryFactoryImpl.create(MarshalledEntryFactoryImpl.java:64)
    at org.infinispan.jcache.embedded.JCacheLoaderAdapter.loadEntry(JCacheLoaderAdapter.java:51)
    at org.infinispan.persistence.manager.PersistenceManagerImpl.loadFromAllStoresSync(PersistenceManagerImpl.java:830)
    at org.infinispan.persistence.manager.PersistenceManagerImpl.lambda$loadFromAllStores$19(PersistenceManagerImpl.java:848)
    at org.infinispan.persistence.manager.PersistenceManagerImpl.lambda$supplyOnPersistenceExAndContinue$9(PersistenceManagerImpl.java:559)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1771)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: org.infinispan.commons.marshall.MarshallingException: No marshaller registered for Java type java.util.UUID
    at org.infinispan.marshall.persistence.impl.PersistenceMarshallerImpl.objectToBuffer(PersistenceMarshallerImpl.java:164)
    at org.infinispan.marshall.persistence.impl.PersistenceMarshallerImpl.objectToBuffer(PersistenceMarshallerImpl.java:132)
    at org.infinispan.mars

Ответы:


1

Infinispan 10.0.x представил значительный рефакторинг своего кода маршаллинга, при этом маршаллер по умолчанию больше не основан на сериализации. Подробное описание различные доступные варианты сортировки.

Для этого варианта использования, поскольку UUID - это неподконтрольный вам класс, маршаллинг на основе сериализации, вероятно, является самым простым способом начать. Необходимо явно настроить JavaSerializationMarshaller и белый список необходимых классов (UUID).

Чтобы сделать это с помощью JCache CachingProvider, необходимо сначала создать следующий XML-файл конфигурации для CacheManager.

<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns="urn:infinispan:config:10.0">
    <cache-container>
        <serialization marshaller="org.infinispan.commons.marshall.JavaSerializationMarshaller">
            <white-list>
              <class>java.util.UUID</class>
            </white-list>
        </serialization>
    </cache-container>
</infinispan>

Затем этот xml используется для создания CacheManager следующим образом:

CachingProvider cachingProvider = Caching.getCachingProvider();
ClassLoader classLoader = SimpleCacheTest.class.getClassLoader();
CacheManager cacheManager = cachingProvider.getCacheManager(classLoader.getResource("example.xml").toURI(), classLoader);

Все последующие кэши, созданные CacheManager, будут настроены для использования JavaSerializationMarshaller.

12.11.2019
  • Не поможет ли его добавление в белый список? infinispan.org/docs/stable/titles/developing/ 10.04.2020
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..