0

我试图解决我在用杰克逊反序列化 EnumSet 时遇到的问题。

我有 en 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),但我通过一堆通用函数调用它,结果代码它只知道它需要构造枚举,但不要知道它应该收缩哪些枚举。使用带有有效类型引用参数的杰克逊阅读器解决了这个问题。

于 2012-12-29T01:38:09.477 回答