Spring Boot 2.3 中带有 Maven 的 Jackson 版本

Posted

技术标签:

【中文标题】Spring Boot 2.3 中带有 Maven 的 Jackson 版本【英文标题】:Jackson version with Maven in SpringBoot 2.3 【发布时间】:2020-10-01 14:02:59 【问题描述】:

当我将我的项目从 SpringBoot 2.2.7 更新到 2.3.0 时,我在启动时遇到以下错误:

Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ser.std.ToStringSerializerBase
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]

更新后我在 Eclipse 中没有看到任何错误。 我指定我不直接在我的 pom.xml 中使用 Jackson,而只使用它的外部包(来自 mvnrepository.com)。

所以我认为这与 Jackson 从 2.10 升级到 2.11 有关,并且可能与外部包的 Maven 依赖关系(例如 jjwt-jackson 使用 2.9)。

在 pom.xml 中,我看到了这个:

之前(SpringBoot 2.9.7):

之后(SpringBoot 2.3.0):

我的解释可以正确吗?有没有使用 pom.xml(或其他任何东西)的解决方案来解决此类问题?

【问题讨论】:

【参考方案1】:

看起来您正在混淆三个不同的 Jackson 版本:

2.9 例如jackson-databind-2.9.10.3 2.10 例如jackson-dataformat-yaml-2.10.1 2.11 例如jackson-datatype-jdk8-2.11.0

这行不通,您必须使用相同的 Jackson 版本。您缺少 ToStringSerializerBase 的特殊问题来自于使用 2.9 和 2.10+。

【讨论】:

感谢您的回答!但是这三个不同的版本被 3 个外部开源包(SpringBoot (2.11)、jjwt-jackson (2.9) 和 springdoc-openapi-ui (2.10),你可以在 mvnrepository 上找到它们)使用,而不是直接用于我的项目。所以我只能希望这个不同的项目能尽快发布新版本? 你不应该混合具有不同传递依赖的库。仅仅因为它们被发布到 maven Central 并不意味着它们会一起工作【参考方案2】:

在您的 pom 文件中使用 maven exclusions 并从 jjwt-jacksonspringdoc-openapi-ui 中排除 2.9 和 2.10 版本。

【讨论】:

以上是关于Spring Boot 2.3 中带有 Maven 的 Jackson 版本的主要内容,如果未能解决你的问题,请参考以下文章

如何通过环境变量设置名称中带有下划线的 Spring Boot 属性?

如何通过环境变量设置名称中带有下划线的 Spring Boot 属性?

属性文件中带有 Thymeleaf -UTF-8 的 Spring Boot CRUD 应用程序

Spring Boot + Thymeleaf 动态表,行中带有复选框与控制器通信

Spring Boot安装及使用(2021.10.28)

Spring Boot安装及使用(2021.10.28)