【发布时间】:2019-12-03 18:52:57
【问题描述】:
class JacksonError(
val x: String,
val isSomething: Boolean
)
因错误而失败
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "something" (class ch.cypherk.blah.JacksonError), not marked as ignorable (2 known properties: "x", "isSomething"])
而没有这样的问题
class NoJacksonError(
val x: String,
val something: Boolean
)
我的第一直觉是 Jackson 不理解 isXY-getters,它只是 需要 getters 以 get 开头。
有趣的是,
class AlsoNoJacksonError (
val x: String,
var isSomething: Boolean
)
这意味着我不知道发生了什么。
JacksonError 被编译为
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 被编译为
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
}
到目前为止,这符合我的期望; JacksonError 有一个 isSomething() 吸气剂,而NoJacksonError 有一个 getSomething() 吸气剂。
但随后AlsoNoJacksonError 被编译为
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
}
其中也有一个isSomething() getter...
那么为什么JacksonError 会产生异常呢?
以及如何让杰克逊正确识别该属性?
【问题讨论】:
-
您是否启用了 Jackson Kotlin 模块? github.com/FasterXML/jackson-module-kotlin
-
@ErwinBolwidt jup.
标签: java kotlin jackson jackson-databind