infinispan 10.1 Маршаллер не зарегистрирован для типа Java java.util.ArrayList
При попытке сохранить объект списка в кеше infinispan выдает ошибку. Я сослался на несколько форумов и тоже включил белый список класса списка, но все равно получаю ту же ошибку.
Примечание: сервер размещен удаленно
Импорт
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.infinispan.client.hotrod.DefaultTemplate;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.commons.api.CacheContainerAdmin;
Код:
// Setup up a clustered cache manager
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host("127.0.0.1").port(11322).addJavaSerialWhiteList("java.util.List","java.util.ArrayList");
// Connect to the server
RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build());
// Create test cache, if such does not exist
cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache("test123", DefaultTemplate.DIST_SYNC);
// Obtain the remote cache
RemoteCache<String, List<String>> cache = cacheManager.getCache("test123");
List<String> test = new ArrayList();
cache.put("key", test);
Исключение
Exception in thread "main" java.lang.IllegalArgumentException: No marshaller registered for Java type java.util.ArrayList
at org.infinispan.protostream.impl.SerializationContextImpl.getMarshallerDelegate(SerializationContextImpl.java:279)
at org.infinispan.protostream.WrappedMessage.writeMessage(WrappedMessage.java:240)
at org.infinispan.protostream.ProtobufUtil.toWrappedByteArray(ProtobufUtil.java:181)
at org.infinispan.protostream.ProtobufUtil.toWrappedByteArray(ProtobufUtil.java:176)
at org.infinispan.commons.marshall.ProtoStreamMarshaller.objectToBuffer(ProtoStreamMarshaller.java:69)
at org.infinispan.commons.marshall.AbstractMarshaller.objectToByteBuffer(AbstractMarshaller.java:70)
at org.infinispan.client.hotrod.marshall.MarshallerUtil.obj2bytes(MarshallerUtil.java:99)
2 ответа
Работая после добавления .marshaller(new JavaSerializationMarshaller())
. Надеюсь, это изменение верное, если доступен лучший вариант, опубликуйте его
builder.addServer().host("127.0.0.1").port(ConfigurationProperties.DEFAULT_HOTROD_PORT).marshaller(new JavaSerializationMarshaller()).addJavaSerialWhiteList("java.util.List","java.util.ArrayList");
К сожалению, маршаллер ProtoStream в настоящее время не поддерживает прямую сортировку ArrayList
, но это планируется в следующем выпуске ProtoStream IPROTO-118.
Маршаллу ArrayList
, или любой Collection
Для реализации с помощью маршаллера Protostream по умолчанию Infinispan необходимо обернуть коллекцию в определяемый пользователем класс и добавить ее как поле. Например, следующий класс позволяет сохранять списки ArrayLists:
public class Book {
@ProtoField(number = 1, collectionImplementation = ArrayList.class)
final List<String> authors;
@ProtoFactory
Book(List<String> authors) {
this.authors = authors;
}
}