0

ジャクソンで EnumSet の逆シリアル化中に直面した問題を解決しようとしています。

私はEnumSetを次のように作成しました

EnumSet set = EnumSet.of(TestEnum.Value1, TestEnum.Value2, TestEnum.Value3);

また、逆シリアル化中に次の例外が発生します。

java.lang.ClassCastException: class java.lang.Enum not an enum
    at java.util.EnumSet.noneOf(EnumSet.java:93)
    at com.fasterxml.jackson.databind.deser.std.EnumSetDeserializer.constructSet(EnumSetDeserializer.java:123)
    at com.fasterxml.jackson.databind.deser.std.EnumSetDeserializer.deserialize(EnumSetDeserializer.java:88)
    at com.fasterxml.jackson.databind.deser.std.EnumSetDeserializer.deserialize(EnumSetDeserializer.java:18)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2575)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1805)
    at com.easycompany.providers.serialization.impl.jackson.base.JacksonSerializationProviderBase.readString(JacksonSerializationProviderBase.java:339)
    at com.easycompany.tests.serialization.base.ReadWriteStringTestBase.read(ReadWriteStringTestBase.java:33)
    at com.easycompany.tests.serialization.base.ReadWriteStringTestBase.action(ReadWriteStringTestBase.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

誰かがそれを修正する方法を教えてもらえますか?

私が解決しました:興味がある場合は、以下の私の回答を読んでください。

4

1 に答える 1

3

私はすでに自分で解決策を見つけました。問題は、メソッドでEnumSet.noneOf()具体的な列挙型(私の場合はTestEnum)を渡す必要があることですが、一連の汎用関数を介して呼び出しているため、コードでは列挙型を構築する必要があることを知っているだけですが、そうではありませんどの列挙型を構築する必要があるかを知っています。有効なタイプ参照パラメーターで jackson リーダーを使用すると、問題が解決します。

于 2012-12-29T01:38:09.477 に答える