Weblogic 11G迁移至12C:Jackson 1与Jackson 2 JSON响应差异匹配
WebLogic 11G→12C迁移:Jersey/Jackson升级后的JSON响应兼容方案
问题概述
在将带有@XmlRootElement注解的EJB应用(POJO复用于JSON和SOAP服务)从WebLogic 11G迁移至12C时,同步完成以下依赖升级:
- Jersey 1.19 → Jersey 2.26(WebLogic 12C支持版本)
- Jackson 1.9.2 → Jackson 2.9.6
- JavaEE API 6.0 → 7.0
迁移后JSON响应与旧环境出现多处格式差异,需调整以匹配11G版本输出,避免下游系统受影响。
差异点及修复方案
1. 布尔值从字符串"true"/"false"变为原生布尔值true/false
Jackson 2默认输出原生布尔类型,而Jackson 1默认将布尔值序列化为字符串。全局开启字符串化布尔值配置:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_BOOLEANS_AS_STRINGS, true);
若需在Jersey中全局生效,通过ContextResolver注入自定义ObjectMapper:
@Provider public class CustomObjectMapperResolver implements ContextResolver<ObjectMapper> { private final ObjectMapper mapper; public CustomObjectMapperResolver() { mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_BOOLEANS_AS_STRINGS, true); // 其他兼容配置追加在此 } @Override public ObjectMapper getContext(Class<?> type) { return mapper; } }
2. 数字类型从字符串"2"变为原生数字2
Jackson 2默认输出原生数字,需强制将数字序列化为字符串:
// 全局所有数字类型转为字符串 mapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
仅需特定字段字符串化时,在POJO字段上添加注解:
@XmlRootElement public class SamplePOJO { @JsonFormat(shape = JsonFormat.Shape.STRING) private Integer userId; // getter/setter }
3. 列表结构从{"list1":[{"foo":"bar",..},...]}变为[{"type":"list1","foo":"bar",..},...]
该差异源于Jackson 2的JAXB模块默认行为变化:旧版会将集合包装在属性名对应的键下,新版按多态形式输出type字段。调整JAXB模块配置:
JaxbAnnotationModule jaxbModule = new JaxbAnnotationModule(); jaxbModule.setDefaultUseWrapper(true); // 启用集合包装逻辑 mapper.registerModule(jaxbModule); mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); // 开启根元素包装
注:Jersey 2可能默认注册JaxbAnnotationModule,若未生效需手动注册。
4. 新增空值字段输出
Jackson 2默认输出空值字段,Jackson 1默认忽略空值。配置忽略空值:
// 仅忽略null值 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 同时忽略空集合、空字符串等空内容 // mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
完整变更文档相关说明
目前没有一站式的"Jackson 1→2/Jersey 1→2 JSON差异+修复"文档,但可通过以下方式覆盖所有场景:
- Jackson官方迁移指南:重点关注序列化特性的默认值变更,以及Jackson 2.x对JAXB注解的处理逻辑调整
- 特性对比对齐:整理Jackson 1.9默认启用的序列化特性,在Jackson 2.9中手动开启/禁用对应特性,核心默认差异包括:
WRITE_BOOLEANS_AS_STRINGS:1.x默认true,2.x默认falseWRAP_ROOT_VALUE:1.x默认true,2.x默认falseWRITE_NUMBERS_AS_STRINGS:1.x默认true,2.x默认falseSerializationInclusion:1.x默认NON_NULL,2.x默认ALWAYS
- Jersey 2 JSON序列化逻辑:Jersey 2默认使用Jackson 2的原生序列化,需确保JAXB注解的处理逻辑与Jersey 1一致
大规模应用验证建议
因无法全量测试,可采取以下策略:
- 抽取核心POJO编写单元测试,对比新旧环境的JSON输出
- 优先通过全局
ObjectMapper配置对齐旧版特性,减少逐个字段修改的工作量 - 启用
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES=false,避免反序列化时因新增字段报错
内容的提问来源于stack exchange,提问作者Arjun T
相关产品推荐
相关产品推荐

