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

InvalidDefinitionException: Cannot construct instance

Open laurynas-agmis opened this issue 2 years ago • 1 comments

Describe the bug Throws an error when trying to deserialise backend API response with retrofit + httpOk + jackson

To Reproduce kotlin version must be higher than 1.5.31 for example 1.6.10 (newest)

Using minifyEnabled true and proguard with following rules: -keep @com.fasterxml.jackson.annotation.JsonIgnoreProperties class * { ; } -keep @com.fasterxml.jackson.annotation.JsonCreator class * { ; } -keep @com.fasterxml.jackson.annotation.JsonValue class * { ; } -keep class com.fasterxml. { ; } -keep class org.codehaus. { ; } -keepnames class com.fasterxml.jackson.* { *; } -keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility { public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; }

throws error when deserializing: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of testClass (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (okhttp3.e0$a); line: 1, column: 2] at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1904) at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400) at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1349) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:351) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:184) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2051) at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1459) at ve.c.a(JacksonResponseBodyConverter.java:33)

Expected behavior Data class getting deserialized from backend response

Versions Kotlin: 1.6.10 Jackson-module-kotlin: 2.13.1 Jackson-databind: 2.13.1 'com.squareup.retrofit2:converter-jackson:2.9.0'

Additional context Works with kotlin versions prior and including 1.5.31 without any other additional changes in configuration or code.

laurynas-agmis avatar Jan 10 '22 13:01 laurynas-agmis

Apparently this is an R8 bug: https://issuetracker.google.com/issues/206855609

Following https://issuetracker.google.com/issues/206855609#comment9 solved the issue.

C2H6O avatar Jan 21 '22 21:01 C2H6O

Apparently this is an R8 bug: https://issuetracker.google.com/issues/206855609

Following https://issuetracker.google.com/issues/206855609#comment9 solved the issue.

This helped a lot, thanks! I'm using r8:3.1.51

ste7en avatar Oct 27 '22 15:10 ste7en

It appears to have been resolved and will be closed.

k163377 avatar Mar 17 '23 04:03 k163377

What's the fix for ProGuard (not R8)? I'm using version 2.14.2.

sryze avatar Apr 27 '23 06:04 sryze