Spring Boot 1.x升级2.2.1后OpenShift部署jackson序列化属性绑定失败
问题原因
- Spring Boot 2.x 对外部配置的绑定规则相比1.x有较大调整,
spring.jackson.serialization要求绑定为Map<SerializationFeature, Boolean>结构,若对应位置的配置被传入字符串类型的值,就会触发该转换错误。 - 本地运行使用dev配置正常,说明OpenShift环境的配置出现了覆盖/格式错误:
- OpenShift部署时激活的非dev配置文件中,
spring.jackson.serialization被错误配置为字符串格式,而非标准的键值对结构。 - OpenShift注入的环境变量存在冲突:若部署配置中注入了
SPRING_JACKSON_SERIALIZATION环境变量且值为字符串,Spring Boot会优先读取该环境变量,无法将字符串转换为目标Map结构。 - 手动指定的Jackson版本与Spring Boot 2.2.1版本不兼容:Spring Boot 2.2.1默认适配的Jackson版本为2.10.x系列,手动升级到2.11.1可能导致配置转换器加载异常。
- 外部配置(如配置中心、启动参数等优先级更高的配置源存在错误格式的
spring.jackson.serialization配置,覆盖了本地配置文件的内容。
- OpenShift部署时激活的非dev配置文件中,
解决方案
- 检查对应环境的配置文件格式
首先确认OpenShift部署时激活的profile,检查对应profile的配置文件中spring.jackson.serialization的配置必须为键值对结构,示例正确配置如下:
spring: jackson: serialization: INDENT_OUTPUT: true
禁止配置为单行字符串格式,如spring.jackson.serialization: "INDENT_OUTPUT: true"。
2. 排查OpenShift环境变量配置
检查部署yaml或平台配置中是否注入了名为SPRING_JACKSON_SERIALIZATION的环境变量,若存在该变量:
优先删除该全局变量,改为拆分单个属性配置为SPRING_JACKSON_SERIALIZATION_INDENT_OUTPUT=true格式的环境变量。
3. 统一Jackson依赖版本
移除pom.xml中jackson-databind、jackson-annotations依赖的version标签,让Spring Boot自带的依赖管理自动管控Jackson版本,避免版本兼容性问题:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency>
- 排查高优先级配置源
若项目接入了配置中心,检查配置中心对应环境的配置,是否存在错误格式的spring.jackson.serialization配置,及时修正格式。
内容的提问来源于stack exchange,提问作者Ab_sin
相关产品推荐
相关产品推荐

