jackson-module-kotlin icon indicating copy to clipboard operation
jackson-module-kotlin copied to clipboard

GenericSignatureFormatError for valid classes inside escaped class

Open TWiStErRob opened this issue 5 years ago • 1 comments

Similar issue has re-surfaced in JDK 8 with Kotlin: https://github.com/fasterxml/jackson-modules-base/issues/8

If an enclosing class has an `Escaped Name`, Jackson crashes with a GenericSignatureFormatError, even though it should just work.

Consider this simple test:

class JacksonSerializationTest {
	class Data(val value: String)
	@Test fun test() {
		val mapper = com.fasterxml.jackson.module.kotlin.jacksonObjectMapper()

		val data: Data = mapper.readValue("""{ "value": "Text" }""")

		assertEquals("Text", data.value)
	}
}

It passes as expected, all is well.

But if the test name is a bit fancier, class `JacksonSerialization Test` {, it crashes with an error:

java.lang.reflect.GenericSignatureFormatError: Signature Parse error: expected ';
at sun.reflect.generics.parser.SignatureParser.error(SignatureParser.java:124)
at sun.reflect.generics.parser.SignatureParser.parsePackageNameAndSimpleClassTypeSignature(SignatureParser.java:348)
at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310)
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289)
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283)
at sun.reflect.generics.parser.SignatureParser.parseTypeArgument(SignatureParser.java:436)
at sun.reflect.generics.parser.SignatureParser.parseTypeArguments(SignatureParser.java:396)
at sun.reflect.generics.parser.SignatureParser.parsePackageNameAndSimpleClassTypeSignature(SignatureParser.java:346)
at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310)
at sun.reflect.generics.parser.SignatureParser.parseClassSignature(SignatureParser.java:213)
at sun.reflect.generics.parser.SignatureParser.parseClassSig(SignatureParser.java:156)
at sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:57)
at sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:41)
at sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:74)
at sun.reflect.generics.repository.GenericDeclRepository.<init>(GenericDeclRepository.java:49)
at sun.reflect.generics.repository.ClassRepository.<init>(ClassRepository.java:53)
at sun.reflect.generics.repository.ClassRepository.make(ClassRepository.java:70)
at java.lang.Class.getGenericInfo(Class.java:2548)
at java.lang.Class.getGenericSuperclass(Class.java:765)
at com.fasterxml.jackson.core.type.TypeReference.<init>(TypeReference.java:33)
at com.example.JacksonSerialization Test$test$$inlined$readValue$1.<init>(Extensions.kt:18)
at com.example.JacksonSerialization Test.test(JacksonSerializationTest.kt:264)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

So this bug report is about broken functionality due to wrong parsing of names. (See also a tightly related #296)

TWiStErRob avatar Feb 04 '20 23:02 TWiStErRob

I just encountered the same issue. Enclosed or local classes will give trouble when using fancy names. Moving the class definition up a level as a workaround fixes this,

MrBuddyCasino avatar Dec 02 '21 16:12 MrBuddyCasino

Closed for the same reasons as the following comment. https://github.com/FasterXML/jackson-module-kotlin/issues/296#issuecomment-1435701058

k163377 avatar Feb 18 '23 15:02 k163377