简体   繁体   中英

exception: “java.lang.ClassCastException: class java.lang.Enum not an enum” during deserialization

I trying to solve problem I faced during desrialization of EnumSet with jackson.

I have en EnumSet created like

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

And during deserialzation get the following exception:

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)

Could anyone help me with the way how to fix that?

Solved by me : if intrested read my answer below.

I already found the solution myself. The problem is that in method EnumSet.noneOf() need to pass concrete enum type (in my case TestEnum), but I'm calling it through a bunch of generic functions and as result in code it just know that it need to construct enum, but don't know which enums it should constract. Using jackson reader with valid type referenced params solve the problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM