繁体   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