簡體   English   中英

傑克遜序列化不包括字段

[英]Jackson Serialization excludes fields

首先,我想給你一些背景信息。

我們有一個由類 B實現的接口A。類 B擴展了抽象類 C

我們通常在調用請求時返回的(rest GET 端點)是 B 中的值以及構成層次結構的所有類中的值(D 擴展 B 等)。

B 包含用於訪問這些值的getter 這些 getter 未在 A 接口中定義。 但是響應有效,值被轉換為 JSON,所以到目前為止沒有問題。 Jackson 能夠調用 getter 並基於它們創建 JSON

現在我們將 Jackson 從 2.6.7 升級到更新的版本。 我們嘗試了 2.10.3 及更高版本。

問題是這些 getter 不再被序列化 如果我們在接口中定義它們是可以的,但是在我們的上下文中這樣做的風險很高。

有誰知道為什么在較新版本的 Jackson 中,未在接口中定義的 getter 會被忽略? 是否有配置,調整或可以強制其先前行為的東西?

后來編輯 1

重要的是要注意對象是如何創建的接口 A obj = new Class C()或層次結構中需要的任何一個;

后來編輯2

也許它還有助於提供 Spring 從 4.0.0 版更新到 5.3.0 版的信息。 該應用程序使用 Spring-mvc,Spring-core,它是一個非 spring-boot 應用程序。

使用的依賴項:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${com.fasterxml.jackson.databind}</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${com.fasterxml.jackson.databind}</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>${com.fasterxml.jackson.version}</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>${com.fasterxml.jackson.version}</version>
</dependency>

早在 2018 年左右,序列化驗證的真實性限制就被濫用並導致漏洞補丁。 這些被稱為“序列化小工具”; 但是當漏洞報告進入公眾視野時 - 許多不同的序列化框架和庫,包括 Jackson,已經分發了與其安裝程序捆綁在一起的軟件包。

對於 Java - 一些可利用的示例數據類型可能是:

java.lang.Object
java.io.Serializable
java.util.Comparable

對於 Jackson - 大約 2.10.xa 發布了對序列化的更改,但我無法找到修補小工具的具體參考。

通常,解決方法是將包含此類數據類型的類的序列化列入黑名單。 幸運的是,開發人員通常包含一個標志(如 ToS 協議),您可以指定該標志以重新啟用這些類的序列化。

不幸的是,我上一次用 Java 編程是在 5 年前——但基於快速閱讀,我想“標志”將包含某種形式的annotation decorator或 xml 配置標簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM