Java Microstream – ImmutablePair 导致 PersistenceExceptionTypeNotPersistable

huangapple go评论141阅读模式
英文:

Java Microstream - ImmutablePair causing PersistenceExceptionTypeNotPersistable

问题

Apache ImmutablePair(org.apache.commons.lang3.tuple.ImmutablePair)在存储Java对象图时引发了PersistenceExceptionTypeNotPersistable。

我该如何解决这个问题?如果需要使用typeHandler,是否有示例?

  1. Caused by: one.microstream.persistence.exceptions.PersistenceExceptionTypeNotPersistable: Type not persistable: "class org.apache.commons.lang3.tuple.ImmutablePair".
  2. at one.microstream.persistence.binary.internal.BinaryHandlerUnpersistable.guaranteeSpecificInstanceViability(BinaryHandlerUnpersistable.java:66)
  3. at one.microstream.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandler(PersistenceTypeHandlerManager.java:336)
  4. at one.microstream.persistence.binary.types.BinaryStorer$Default.registerGuaranteed(BinaryStorer.java:557)
  5. at one.microstream.persistence.binary.types.BinaryStorer$Default.registerLazyOptional(BinaryStorer.java:572)
  6. at one.microstream.persistence.types.PersistenceObjectManager$Default.ensureObjectId(PersistenceObjectManager.java:182)
  7. at one.microstream.persistence.binary.types.BinaryStorer$Default.register(BinaryStorer.java:591)
  8. at one.microstream.persistence.binary.types.BinaryStorer$Default.apply(BinaryStorer.java:298)
  9. at one.microstream.persistence.binary.types.Binary.storeIterableContentAsList(Binary.java:1698)
  10. at one.microstream.persistence.binary.types.Binary.storeIterableAsList(Binary.java:668)
  11. at one.microstream.persistence.binary.internal.AbstractBinaryHandlerCustomIterableSimpleListElements.store(AbstractBinaryHandlerCustomIterableSimpleListElements.java:64)
  12. at one.microstream.persistence.binary.internal.AbstractBinaryHandlerCustomIterableSimpleListElements.store(AbstractBinaryHandlerCustomIterableSimpleListElements.java:1)
  13. at one.microstream.persistence.binary.internal.AbstractBinaryHandlerCustom.store(AbstractBinaryHandlerCustom.java:1)
  14. at one.microstream.persistence.binary.types.BinaryStorer$Default.storeItem(BinaryStorer.java:414)
  15. at one.microstream.persistence.binary.types.BinaryStorer$Default.storeGraph(BinaryStorer.java:403)
  16. at one.microstream.persistence.binary.types.BinaryStorer$Default.store(BinaryStorer.java:421)
  17. at one.microstream.persistence.types.PersistenceManager$Default.store(PersistenceManager.java:274)
  18. at one.microstream.storage.types.StorageConnection.store(StorageConnection.java:306)
  19. at one.microstream.cache.CacheStore$Default.write(CacheStore.java:112)
英文:

Apache ImmutablePair, (org.apache.commons.lang3.tuple.ImmutablePair) causing PersistenceExceptionTypeNotPersistable when storing Java Object graph.

How should I solve this? If with a typeHandler, is there an example?

  1. Caused by: one.microstream.persistence.exceptions.PersistenceExceptionTypeNotPersistable: Type not persistable: "class org.apache.commons.lang3.tuple.ImmutablePair".
  2. at one.microstream.persistence.binary.internal.BinaryHandlerUnpersistable.guaranteeSpecificInstanceViablity(BinaryHandlerUnpersistable.java:66)
  3. at one.microstream.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandler(PersistenceTypeHandlerManager.java:336)
  4. at one.microstream.persistence.binary.types.BinaryStorer$Default.registerGuaranteed(BinaryStorer.java:557)
  5. at one.microstream.persistence.binary.types.BinaryStorer$Default.registerLazyOptional(BinaryStorer.java:572)
  6. at one.microstream.persistence.types.PersistenceObjectManager$Default.ensureObjectId(PersistenceObjectManager.java:182)
  7. at one.microstream.persistence.binary.types.BinaryStorer$Default.register(BinaryStorer.java:591)
  8. at one.microstream.persistence.binary.types.BinaryStorer$Default.apply(BinaryStorer.java:298)
  9. at one.microstream.persistence.binary.types.Binary.storeIterableContentAsList(Binary.java:1698)
  10. at one.microstream.persistence.binary.types.Binary.storeIterableAsList(Binary.java:668)
  11. at one.microstream.persistence.binary.internal.AbstractBinaryHandlerCustomIterableSimpleListElements.store(AbstractBinaryHandlerCustomIterableSimpleListElements.java:64)
  12. at one.microstream.persistence.binary.internal.AbstractBinaryHandlerCustomIterableSimpleListElements.store(AbstractBinaryHandlerCustomIterableSimpleListElements.java:1)
  13. at one.microstream.persistence.binary.internal.AbstractBinaryHandlerCustom.store(AbstractBinaryHandlerCustom.java:1)
  14. at one.microstream.persistence.binary.types.BinaryStorer$Default.storeItem(BinaryStorer.java:414)
  15. at one.microstream.persistence.binary.types.BinaryStorer$Default.storeGraph(BinaryStorer.java:403)
  16. at one.microstream.persistence.binary.types.BinaryStorer$Default.store(BinaryStorer.java:421)
  17. at one.microstream.persistence.types.PersistenceManager$Default.store(PersistenceManager.java:274)
  18. at one.microstream.storage.types.StorageConnection.store(StorageConnection.java:306)
  19. at one.microstream.cache.CacheStore$Default.write(CacheStore.java:112)

答案1

得分: 0

以下是直接由MicroStream共享的答案,我可以确认这个答案完美地工作。

你好,

如果一个类被视为不可持久化的,可以为这些类提供自定义类型处理程序的实现。在你的情况下,自定义类型处理程序可能如下所示:

  1. import org.apache.commons.lang3.tuple.ImmutablePair;
  2. import one.microstream.persistence.binary.internal.CustomBinaryHandler;
  3. import one.microstream.persistence.binary.types.Binary;
  4. import one.microstream.persistence.binary.types.BinaryField;
  5. import one.microstream.persistence.types.PersistenceLoadHandler;
  6. import one.microstream.reflect.XReflect;
  7. public class ImmutablePairTypeHandler extends CustomBinaryHandler<ImmutablePair<?, ?>>
  8. {
  9. @SuppressWarnings({"unchecked", "rawtypes"})
  10. private static Class<ImmutablePair<?, ?>> handledType()
  11. {
  12. return (Class) ImmutablePair.class; // to get ".class" to work
  13. }
  14. // the fields to be persisted
  15. BinaryField<ImmutablePair<?, ?>> left = Field(Object.class, ImmutablePair::getLeft);
  16. BinaryField<ImmutablePair<?, ?>> right = Field(Object.class, ImmutablePair::getRight);
  17. public ImmutablePairTypeHandler()
  18. {
  19. super(handledType());
  20. }
  21. @Override
  22. public ImmutablePair<?, ?> create(final Binary data, final PersistenceLoadHandler handler)
  23. {
  24. // create an empty instance, don't use nullPair() as it is a static final
  25. return ImmutablePair.of(null, null);
  26. }
  27. @Override
  28. public void initializeState(final Binary data, final ImmutablePair<?, ?> instance, final PersistenceLoadHandler handler)
  29. {
  30. // get the referenced Objects
  31. final Object left = this.left.readReference(data, handler);
  32. final Object right = this.right.readReference(data, handler);
  33. // as the pair is immutable we can't set the pair's fields directly
  34. final ImmutablePair<?, ?> pair = ImmutablePair.of(left, right);
  35. XReflect.copyFields(pair, instance);
  36. }
  37. }

要启用此处理程序,只需注册它:

  1. final EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation(workdir);
  2. foundation.registerTypeHandler(new ImmutablePairTypeHandler());
  3. final EmbeddedStorageManager storage = foundation.start();
英文:

Below is the answer per shared by microstream directly, and I can confirm this works perfectly.

Hello,

If a class is considered as unpersitable it is possible to provide a custom type handler implementation for such classes. In your case a custom type handler may look like:

  1. import org.apache.commons.lang3.tuple.ImmutablePair;
  2. import one.microstream.persistence.binary.internal.CustomBinaryHandler;
  3. import one.microstream.persistence.binary.types.Binary;
  4. import one.microstream.persistence.binary.types.BinaryField;
  5. import one.microstream.persistence.types.PersistenceLoadHandler;
  6. import one.microstream.reflect.XReflect;
  7. public class ImmutablePairTypeHandler extends CustomBinaryHandler&lt;ImmutablePair&lt;?, ?&gt;&gt;
  8. {
  9. @SuppressWarnings({&quot;unchecked&quot;, &quot;rawtypes&quot;})
  10. private static Class&lt;ImmutablePair&lt;?, ?&gt;&gt; handledType()
  11. {
  12. return (Class)ImmutablePair.class; // to get &quot;.class&quot; to work
  13. }
  14. //the fields to be persisted
  15. BinaryField&lt;ImmutablePair&lt;?, ?&gt;&gt; left = Field(Object.class, ImmutablePair::getLeft);
  16. BinaryField&lt;ImmutablePair&lt;?, ?&gt;&gt; right = Field(Object.class, ImmutablePair::getRight);
  17. public ImmutablePairTypeHandler()
  18. {
  19. super(handledType());
  20. }
  21. @Override
  22. public ImmutablePair&lt;?, ?&gt; create(final Binary data, final PersistenceLoadHandler handler)
  23. {
  24. //create a empty instance, don&#39;t use nullPair() as it is a static final
  25. return ImmutablePair.of(null, null);
  26. }
  27. @Override
  28. public void initializeState(final Binary data, final ImmutablePair&lt;?, ?&gt; instance, final PersistenceLoadHandler handler)
  29. {
  30. //get the referenced Objects
  31. final Object left = this.left.readReference(data, handler);
  32. final Object right = this.right.readReference(data, handler);
  33. //as the pair is immutable we can&#39;t set the pairs fields directly
  34. final ImmutablePair&lt;?,?&gt; pair = ImmutablePair.of(left, right);
  35. XReflect.copyFields(pair, instance);
  36. }
  37. }

To enable this handler just register it:

  1. final EmbeddedStorageFoundation&lt;?&gt; foundation = EmbeddedStorage.Foundation(workdir);
  2. foundation.registerTypeHandler(new ImmutablePairTypeHandler());
  3. final EmbeddedStorageManager storage = foundation.start();

huangapple
  • 本文由 发表于 2020年8月5日 03:22:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/63253772.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定