异常:反序列化期间的“java.lang.ClassCastException:类java.lang.Enum不是枚举”

时间:2012-12-29 01:11:54

标签: java exception jackson

我试图解决我在杰克逊对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)

有人可以帮我解决这个问题吗?

由我解决:如果有兴趣请阅读下面的答案。

1 个答案:

答案 0 :(得分:3)

我自己已经找到了解决方案。问题是方法EnumSet.noneOf()需要传递具体的枚举类型(在我的情况下是TestEnum),但我通过一堆泛型函数调用它,并且在代码中它只知道它需要构造枚举,但不知道它应该构成哪些枚举。使用具有有效类型参考params的jackson reader解决了这个问题。