class JacksonError(
val x: String,
val isSomething: Boolean
)
fails with an error
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "something" (class ch.cypherk.blah.JacksonError), not marked as ignorable (2 known properties: "x", "isSomething"])
whereas there's no such issue with
class NoJacksonError(
val x: String,
val something: Boolean
)
My first instinct was that Jackson does not understand isXY
-getters and that it simply needs the getters to start with get
.
Interestingly, however, there's also no issue with
class AlsoNoJacksonError (
val x: String,
var isSomething: Boolean
)
Which means I have no idea what's happening.
JacksonError
gets compiled to
public final class ch.cypherk.blah.JacksonError {
public final java.lang.String getX();
Code:
0: aload_0
1: getfield #11 // Field x:Ljava/lang/String;
4: areturn
public final boolean isSomething();
Code:
0: aload_0
1: getfield #18 // Field isSomething:Z
4: ireturn
public ch.cypherk.blah.JacksonError(java.lang.String, boolean);
Code:
0: aload_1
1: ldc #21 // String x
3: invokestatic #27 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: aload_0
7: invokespecial #30 // Method java/lang/Object."<init>":()V
10: aload_0
11: aload_1
12: putfield #11 // Field x:Ljava/lang/String;
15: aload_0
16: iload_2
17: putfield #18 // Field isSomething:Z
20: return
}
NoJacksonError
gets compiled to
public final class ch.cypherk.blah.NoJacksonError {
public final java.lang.String getX();
Code:
0: aload_0
1: getfield #11 // Field x:Ljava/lang/String;
4: areturn
public final boolean getSomething();
Code:
0: aload_0
1: getfield #19 // Field something:Z
4: ireturn
public ch.cypherk.blah.NoJacksonError(java.lang.String, boolean);
Code:
0: aload_1
1: ldc #22 // String x
3: invokestatic #28 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: aload_0
7: invokespecial #31 // Method java/lang/Object."<init>":()V
10: aload_0
11: aload_1
12: putfield #11 // Field x:Ljava/lang/String;
15: aload_0
16: iload_2
17: putfield #19 // Field something:Z
20: return
}
So far, this meets my expectations; JacksonError
has an isSomething()
getter whereas NoJacksonError
has a getSomething()
getter.
But then AlsoNoJacksonError
gets compiled to
public final class ch.cypherk.blah.AlsoNoJacksonError {
public final java.lang.String getX();
Code:
0: aload_0
1: getfield #11 // Field x:Ljava/lang/String;
4: areturn
public final boolean isSomething();
Code:
0: aload_0
1: getfield #18 // Field isSomething:Z
4: ireturn
public final void setSomething(boolean);
Code:
0: aload_0
1: iload_1
2: putfield #18 // Field isSomething:Z
5: return
public ch.cypherk.blah.AlsoNoJacksonError(java.lang.String, boolean);
Code:
0: aload_1
1: ldc #24 // String x
3: invokestatic #30 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: aload_0
7: invokespecial #33 // Method java/lang/Object."<init>":()V
10: aload_0
11: aload_1
12: putfield #11 // Field x:Ljava/lang/String;
15: aload_0
16: iload_2
17: putfield #18 // Field isSomething:Z
20: return
}
which also has an isSomething()
getter...
So why does JacksonError
produce the exception?
And how do I make Jackson recognise the property correctly?