【问题标题】:Jackson Serialization excludes fields杰克逊序列化不包括字段
【发布时间】:2021-12-02 17:15:39
【问题描述】:

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

我们有一个 接口 A,它由 B 类实现。 B 类扩展 抽象 C类

我们通常在调用请求时返回(其余的 GET 端点)是 B 中的值以及构成层次结构的所有类中的值(D 扩展 B 等等)。

B 包含获取这些值的方法这些 getter 未在 A 接口中定义。 但是响应有效,这些值被转换为 JSON,所以到目前为止没有问题。 Jackson 能够调用 getter 并基于它们创建 JSON

现在我们正在将 Jackson 从 2.6.7 升级到更新的版本。我们尝试了 2.10.3 及更高版本。

问题是这些 getter 不再被序列化。如果我们在界面中定义它们是可以的,但在我们的上下文中这样做的风险很高。

有谁知道为什么在较新版本的 Jackson 中,接口中未定义的 getter 会被忽略? 是否有配置、调整或其他可以强制其先前行为的东西?

稍后编辑 1

需要注意对象是如何创建的Interface 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>

【问题讨论】:

  • 您的类型是否有任何自定义序列化配置?在多态模型中,肯定有一个,否则自定义类型映射是不可能的。一个由一种(或多种)类型实现的接口的简单示例会很好地工作。

标签: java spring spring-mvc jackson jackson-databind


【解决方案1】:

自 2018 年左右以来,利用序列化验证限制的真实性被滥用并导致漏洞补丁。 这些被称为“序列化小工具”;但当漏洞报告进入公众视野时 - 许多不同的序列化框架和库,包括 Jackson,已经与它们的安装程序一起分发捆绑包。

对于 Java - 一些可能被利用的示例数据类型可能是:

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

对于 Jackson - 大约 2.10.x 发布了对序列化的更改,但我无法找到修补小工具的具体参考。

通常,解决方法是将包含此类数据类型的类的序列化列入黑名单。幸运的是,开发人员通常包含一个标志(如 ToS 协议),您可以指定该标志以重新启用这些类的序列化。

不幸的是,我最后一次使用 Java 编程是在 5 年前 - 但根据快速阅读,我想“标志”将包括某种形式的 annotation decorator 或 xml 配置标签。

【讨论】:

  • 感谢您提供此信息,我会检查一下
  • 如果您找到解决方案,请告诉我 - 如果不是在周末之前,我会为您提供赏金 :)
  • 谢谢你,太客气了!我会继续研究。还没有成功
  • 是的,这比我想象的要复杂:D 原因还在于用作响应的对象非常复杂,并且在不干扰现有内容的情况下找到解决方案比我想象的要难。干扰响应所隐含的风险很高,因为代码库很大,而且并非所有内容都经过全面测试。
  • 我刚刚意识到我没有在您的依赖项中看到 Jackson.databind....您可以访问您的序列化中打包的 objectMapper 吗?
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2014-05-05
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多