第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Jackson 會為以 is 開頭的 Kotlin 布爾型 val 拋出

為什么 Jackson 會為以 is 開頭的 Kotlin 布爾型 val 拋出

呼如林 2023-04-19 15:39:17
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)這意味著我不知道發(fā)生了什么。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}
查看完整描述

1 回答

?
RISEBY

TA貢獻1856條經(jīng)驗 獲得超5個贊

解決這個問題有兩個因素。
第一:如果沒有指定 @JsonProperty 字段,
Jackson 默認使用 Java bean 命名約定來暗示 json 字段名稱(對于布爾字段,其 getter/setter 的命名約定是什么? )。我測試了代碼,序列化適用于 JacksonError 類,因為有一個 getter 符合 bean 訪問器的 Java 命名標準。然而,在反序列化時,它看起來是通過名稱“setSomething()”訪問一個 getter。如果您觀察到,具有 setSomething 方法的類不會出現(xiàn)反序列化錯誤。

第二:沒有為 JacksonError 類生成 setSomething() 方法的原因是因為它是一個 val 字段并且它不生成 setter(val 字段是不可變的并且僅在構(gòu)造函數(shù)中初始化,因此沒有 setter)。就像@Erwin Bolwidt 建議的那樣,您可以將以下屬性設(shè)置為對象映射器以包含 jackson 的 kotlin 模塊

?val?mapper?=?ObjectMapper().registerKotlinModule()?
????????.setVisibility(PropertyAccessor.FIELD,?JsonAutoDetect.Visibility.ANY)
????????.setVisibility(PropertyAccessor.CREATOR,?JsonAutoDetect.Visibility.NONE)
????????.setVisibility(PropertyAccessor.GETTER,?JsonAutoDetect.Visibility.NONE)
????????.setVisibility(PropertyAccessor.SETTER,?JsonAutoDetect.Visibility.NONE)
????????.setVisibility(PropertyAccessor.IS_GETTER,?JsonAutoDetect.Visibility.NONE)

ObjectMapper().registerKotlinModule :這注冊了有助于序列化/反序列化 kotlin 類的模塊。

setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) :使所有字段可序列化,包括私有字段(在您的情況下為 val 字段)

????????.setVisibility(PropertyAccessor.CREATOR,?JsonAutoDetect.Visibility.NONE)??:??Makes?sure?any?static?/?factory?constructors?are?not?autodetected

????????.setVisibility(PropertyAccessor.GETTER,?JsonAutoDetect.Visibility.NONE)
????????.setVisibility(PropertyAccessor.SETTER,?JsonAutoDetect.Visibility.NONE)
????????.setVisibility(PropertyAccessor.IS_GETTER,?JsonAutoDetect.Visibility.NONE)?:

所有這些道具都通知對象映射器忽略任何 getters/setters 和 boolean setters 的自動檢測


查看完整回答
反對 回復(fù) 2023-04-19
  • 1 回答
  • 0 關(guān)注
  • 297 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號