Jackson3遷移核心注意點(diǎn)總結(jié)大全
一、核心要點(diǎn)(必掌握,遷移基礎(chǔ))
1. 環(huán)境基線升級(jí): 最低支持 JDK 17(2.x 為 JDK 8),項(xiàng)目需先完成 JDK 升級(jí)適配。
2. 包名與依賴變更:
- Maven groupId:com.fasterxml.jackson → tools.jackson(jackson-annotations 除外,仍用 2.x 版本)Java 導(dǎo)入包:
- com.fasterxml.jackson.xxx → tools.jackson.xxx(com.fasterxml.jackson.annotation 保留不變)
3. 核心 API 不可變性: ObjectMapper(及子類)、JsonFactory(及子類)變?yōu)橥耆豢勺?,必須通過 Builder 模式構(gòu)建(不再支持直接 set 配置)。
JsonMapper m=JsonMapper.builder().build(); JsonFactory f = JsonFactory.builder().build();
4 .異常體系重構(gòu): 所有異常改為非檢查型(繼承 RuntimeException),核心異常類重命名(如 JsonProcessingException → JacksonException)。 5. 格式綁定強(qiáng)制化: 必須使用格式對(duì)齊的 ObjectMapper 子類(如 JsonMapper、YAMLMapper、XmlMapper),禁止 new ObjectMapper(new YAMLFactory()) 寫法。 6. Java 8 模塊內(nèi)置: jackson-module-parameter-names、jackson-datatype-jdk8、jackson-datatype-jsr310 已整合到 jackson-databind,無需單獨(dú)依賴。
二、關(guān)鍵變更(影響代碼改造)
1. 內(nèi)容移除
- 版本標(biāo)記為 @Deprecated 的方法、字段、類全部刪除( 參考 2.20 javadoc 替換為替代方案)。
- 移除模塊 jackson-module-jsonSchema 、jackson-datatype-hibernateX。
- 移除功能:格式自動(dòng)檢測(cè)(DataFormatDetector 等相關(guān)類)、ObjectMapper.canSerialize()/canDeserialize() 方法。
- JsonParser
canWriteBinaryNatively(), canWriteFormattedNumbers()分別替為StreamWriteCapability.CAN_WRITE_BINARY_NATIVELY / StreamWriteCapability.CAN_WRITE_FORMATTED_NUMBERS - JsonFactory
getCodec() 、 setCodec()被移除 - com.fasterxml.jackson.databind.MappingJsonFactory 被移除
- com.fasterxml.jackson.core.ObjectCodec 被移除,替換為 2 個(gè)獨(dú)立的接口: tools.jackson.core.ObjectReadContext(實(shí)現(xiàn)類:DeserializationContext) , tools.jackson.core.ObjectWriteContext(實(shí)現(xiàn)類: SerializationContext )
- tools.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator 已不再公開。請(qǐng)使用 BasicPolymorphicTypeValidator.builder()
- JsonGenerator.setPrettyPrinter() 被移除
- request payload 能力被移除
- BufferRecyclers.SYSTEM_PROPERTY_TRACK_REUSABLE_BUFFERS 被移除
- TokenStreamFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING 被移除
- 在 Jackson 2.x 的 JsonFactory 類中,接受 URL 參數(shù)的工廠方法將被移除
2. 類與方法重命名(高頻變更)
| 2.x 舊名稱 | 3.x 新名稱 | ||
|---|---|---|---|
| JsonProcessingException | JacksonException(基類) | ||
| JsonParseException | StreamReadException | ||
| JsonEOFException | UnexpectedEndOfInputException | JsonGenerationException | StreamWriteException |
| JsonGenerator.writeObject() | JsonGenerator.writePOJO() | ||
| JsonGenerator.getCurrentValue() | JsonGenerator.currentValue() | JsonGenerator.setCurrentValue() | JsonGenerator.assignCurrentValue() |
| JsonGenerator.getCodec() | JsonGenerator.objectWriteContext() | ||
| JsonParser.getCurrentLocation() | JsonParser.currentLocation() | ||
| JsonParser.getTokenLocation() | JsonGenerator.currentTokenLocation() | ||
| JsonParser.getCurrentValue() | JsonParser.currentValue() | ||
| JsonParser.setCurrentValue() | JsonParser.assignCurrentValue() | ||
| JsonParser."xxxTextYyy"() 格式 如(getTextCharacters()) | JsonParser."xxxStringYyy"() 格式 如(getStringCharacters()) | ||
| JsonParser.getCodec() | JsonParser.objectReadContext() | ||
| JsonToken.FIELD_NAME | JsonToken.PROPERTY_NAME | ||
| JsonFactory | TokenStreamFactory | ||
| JsonStreamContext | TokenStreamContext | ||
| JsonLocation | TokenStreamLocation | ||
| JsonDeserializer | ValueDeserializer | ||
| JsonSerializer | ValueSerializer | ||
| JsonMappingException | DatabindException | ||
| Module | JacksonModule(避免與 JDK Module 沖突) | ||
| TextNode | StringNode | ||
| BeanSerializerModifier | ValueSerializerModifier | ||
| BeanDeserializerModifier | ValueDeserializerModifier | ||
| SerializerProvider | SerializationContext | ||
| TextNode | StringNode | ||
| AnnotationIntrospector.findDefaultCreator() | findPreferredCreator() | ||
| JsonNode.elements() | JsonNode.values() | ||
| ContainerSerializer | StdContainerSerializer | ||
| ObjectMapper.getRegisteredModuleIds() | ObjectMapper.registeredModules() | ||
| TreeNode.propertyNames() 的返回類型 | 從 Iterator 更改為 Collection | ||
| TreeNode.isContainerNode() | TreeNode. isContainer() | ||
| JsonGenerator.Feature.AUTO_CLOSE_JSON_CONTENT | JsonGenerator.Feature.AUTO_CLOSE_CONTENT |
3. 配置默認(rèn)值變更(易引發(fā)行為差異)
| 枚舉 | 配置項(xiàng) | 2.x 默認(rèn)值 | 3.x 默認(rèn)值 | 影響說明 |
|---|---|---|---|---|
| DeserializationFeature | FAIL_ON_TRAILING_TOKENS | 關(guān)閉 | 開啟 | 校驗(yàn) JSON 末尾是否存在多余字符(如解析對(duì)象后還有額外的逗號(hào) / 字符),提升數(shù)據(jù)合法性校驗(yàn),但會(huì)增加少量解析開銷;若輸入數(shù)據(jù)可信(如內(nèi)部系統(tǒng)交互),可關(guān)閉以恢復(fù) 2.x 性能。 |
| FAIL_ON_UNKNOWN_PROPERTIES | 開啟 | 關(guān)閉 | 反序列化時(shí)遇到目標(biāo)類不存在的字段,不再拋出 UnrecognizedPropertyException,而是直接忽略;可能掩蓋字段名拼寫錯(cuò)誤、接口字段變更等問題,建議在測(cè)試環(huán)境開啟該配置,生產(chǎn)環(huán)境按需關(guān)閉。 | |
| READ_ENUMS_USING_TO_STRING | 關(guān)閉 | 開啟(遷移至 EnumFeature) | 反序列化枚舉時(shí),默認(rèn)按 Enum.toString() 結(jié)果匹配(2.x 默認(rèn)按枚舉名稱 / 索引);若枚舉重寫了 toString(),會(huì)改變反序列化邏輯,需確認(rèn)枚舉值映射規(guī)則,或顯式配置 EnumFeature.READ_ENUMS_USING_TO_STRING=false 回退。 | |
| FAIL_ON_NULL_FOR_PRIMITIVES | 關(guān)閉 | 開啟 | 反序列化時(shí),若基本類型(int/long/boolean 等)字段接收到 null 值,會(huì)拋出 DatabindException;2.x 會(huì)默認(rèn)賦值基本類型默認(rèn)值(如 int=0),可能暴露空值處理漏洞,但也會(huì)導(dǎo)致原有依賴 “空值轉(zhuǎn)默認(rèn)值” 的代碼報(bào)錯(cuò)。 | |
| SerializationFeature | WRITE_ENUMS_USING_TO_STRING | 關(guān)閉 | 開啟(遷移至 EnumFeature) | 序列化枚舉時(shí),默認(rèn)輸出 Enum.toString() 結(jié)果(2.x 默認(rèn)輸出枚舉名稱);若枚舉重寫了 toString(),序列化結(jié)果會(huì)變化,需統(tǒng)一枚舉序列化規(guī)則,或配置 EnumFeature.WRITE_ENUMS_USING_TO_STRING=false。 |
| FAIL_ON_EMPTY_BEANS | 開啟 | 關(guān)閉 | 序列化無屬性 / 無 getter 的空 Bean 時(shí),不再拋出 JsonMappingException,而是輸出空對(duì)象 {};避免因 Bean 結(jié)構(gòu)臨時(shí)調(diào)整導(dǎo)致序列化失敗,但需注意空對(duì)象可能不符合下游系統(tǒng)的解析預(yù)期。 | |
| FAIL_ON_ORDER_MAP_BY_INCOMPARABLE_KEY | 開啟 | 關(guān)閉 | 序列化 SortedMap 時(shí),若 Key 不實(shí)現(xiàn) Comparable 接口,不再拋出異常;2.x 會(huì)強(qiáng)制校驗(yàn) Key 的可比較性,3.x 放寬限制,但可能導(dǎo)致 Map 排序混亂,需確保 SortedMap 的 Key 符合 Comparable 規(guī)范。 | |
| WRITE_DURATIONS_AS_TIMESTAMPS | 開啟 | 關(guān)閉(遷移至 DateTimeFeature) | 序列化 java.time.Duration 時(shí),默認(rèn)輸出 ISO-8601 字符串(如 PT1H30M),而非 2.x 的毫秒數(shù)時(shí)間戳;需確認(rèn)下游系統(tǒng)是否兼容 Duration 的字符串格式,或配置 DateTimeFeature.WRITE_DURATIONS_AS_TIMESTAMPS=true 回退。 | |
| WRITE_DATES_AS_TIMESTAMPS | 開啟 | 關(guān)閉(遷移至 DateTimeFeature) | 序列化日期時(shí)間類型(如 LocalDateTime/Date)時(shí),默認(rèn)輸出 ISO-8601 字符串(如 2025-12-09T10:00:00),而非 2.x 的毫秒時(shí)間戳;會(huì)改變接口返回的日期格式,需同步更新前端 / 下游系統(tǒng)的解析邏輯。 | |
| WRITE_DATE_KEYS_AS_TIMESTAMPS | 關(guān)閉 | 關(guān)閉(遷移至 DateTimeFeature) | 無默認(rèn)值變化,但配置項(xiàng)歸屬?gòu)?SerializationFeature 遷移至 DateTimeFeature;代碼中需替換配置引用路徑,否則會(huì)報(bào) “配置項(xiàng)不存在” 錯(cuò)誤。 | |
| StreamReadFeature | USE_FAST_DOUBLE_PARSER | 關(guān)閉 | 開啟 | 解析浮點(diǎn)數(shù)字段時(shí)使用更快的雙精度解析器(基于 jdk.incubator.vector 或優(yōu)化算法);提升浮點(diǎn)數(shù)解析性能,但極端場(chǎng)景下可能存在精度差異(概率極低),需校驗(yàn)高精度浮點(diǎn)數(shù)據(jù)的解析結(jié)果。 |
| USE_FAST_BIG_NUMBER_PARSER | 關(guān)閉 | 開啟 | 解析大數(shù)字(如 BigDecimal/BigInteger)時(shí)使用優(yōu)化解析器;提升大數(shù)字解析效率,無兼容性風(fēng)險(xiǎn),但需確保解析后的大數(shù)精度符合業(yè)務(wù)要求。 | |
| StreamWriteFeature | USE_FAST_DOUBLE_WRITER | 關(guān)閉 | 開啟 | 序列化浮點(diǎn)數(shù)時(shí)使用更快的雙精度寫入器;提升浮點(diǎn)數(shù)字段序列化性能,極端場(chǎng)景可能存在小數(shù)位輸出格式差異(如 0.1 變?yōu)?0.100000001),需校驗(yàn)金融 / 高精度場(chǎng)景的浮點(diǎn)輸出。 |
| TokenStreamFactory.Feature | INTERN_PROPERTY_NAMES | 啟用 | 關(guān)閉 | 不再對(duì) JSON 屬性名進(jìn)行字符串駐留(String Intern);減少內(nèi)存占用(避免常量池膨脹),但頻繁解析相同屬性名的 JSON 時(shí),會(huì)增加字符串創(chuàng)建開銷,高并發(fā)場(chǎng)景可按需重新開啟。 |
| MapperFeature | USE_STD_BEAN_NAMING | 關(guān)閉 | 移除(始終啟用) | 強(qiáng)制使用標(biāo)準(zhǔn) JavaBean 命名規(guī)范(如 getXxx() 對(duì)應(yīng)字段 xxx);2.x 需手動(dòng)開啟,3.x 內(nèi)置生效,若代碼依賴非標(biāo)準(zhǔn)命名(如 getXXX() 對(duì)應(yīng) XXX),會(huì)導(dǎo)致字段序列化 / 反序列化失敗。 |
| AUTO_DETECT_xxx(CREATORS/FIELDS/GETTERS/IS_GETTERS/SETTERS) | 開啟 | 移除 | 不再自動(dòng)檢測(cè) Bean 的創(chuàng)建器 / 字段 / 訪問器,需顯式配置可見性規(guī)則;2.x 依賴自動(dòng)檢測(cè)的場(chǎng)景(如無注解的私有字段序列化)會(huì)失效,需通過 changeDefaultVisibility 配置字段 / 方法的可見性。 | |
| ALLOW_FINAL_FIELDS_AS_MUTATORS | 啟用 | 關(guān)閉 | 禁止通過反射修改 final 字段的值;2.x 允許強(qiáng)制修改 final 字段(非規(guī)范行為),3.x 禁用后,依賴 “final 字段反序列化賦值” 的代碼會(huì)報(bào)錯(cuò),需改為通過構(gòu)造器 / 工廠方法初始化 final 字段。 | |
| DEFAULT_VIEW_INCLUSION | 啟用 | 關(guān)閉 | 未指定 @JsonView 時(shí),不再默認(rèn)序列化所有字段,僅序列化無 View 注解的字段;若代碼依賴 “默認(rèn)包含所有字段” 的邏輯,需顯式配置 MapperFeature.DEFAULT_VIEW_INCLUSION=true,或補(bǔ)全 @JsonView 注解。 | |
| USE_GETTERS_AS_SETTERS | 啟用 | 關(guān)閉 | 不再將 getXxx() 方法當(dāng)作 setXxx() 使用(如反序列化集合字段時(shí)調(diào)用 getter 獲取集合后添加元素);2.x 為兼容 JAXB 的非規(guī)范行為,3.x 禁用后,需為集合 / 映射字段添加顯式的 setter 方法。 | |
| SORT_PROPERTIES_ALPHABETICALLY | 關(guān)閉 | 開啟 | 序列化 POJO 時(shí)默認(rèn)按字段名字母排序輸出;2.x 按字段定義順序輸出,3.x 改變輸出順序,可能導(dǎo)致依賴字段順序的簽名校驗(yàn)(如 MD5 驗(yàn)簽)失敗,需顯式配置 @JsonPropertyOrder 固定順序。 | |
| OVERRIDE_PUBLIC_ACCESS_MODIFIERS | 啟用 | 關(guān)閉 | 不再覆蓋公共字段 / 方法的訪問修飾符(如強(qiáng)制訪問 public final 方法);2.x 可通過反射突破訪問限制,3.x 禁用后,需確保 Bean 的字段 / 方法訪問權(quán)限符合序列化要求(如 public getter)。 | |
| DateTimeFeature | ONE_BASED_MONTHS | 關(guān)閉 | 開啟 | 解析 / 序列化日期時(shí),月份按 “1 基” 處理(1=1 月,12=12 月);2.x 部分場(chǎng)景為 “0 基”(0=1 月),修復(fù)了月份解析的反直覺問題,但需校驗(yàn)老數(shù)據(jù)中 “0 基月份” 的兼容性(如 2025-00-09 會(huì)解析失?。?/td> |
| StreamReadConstraints | DEFAULT_MAX_DEPTH | 1000 | 500 | JSON 嵌套解析的最大深度從 1000 降至 500;限制深層嵌套 JSON 的解析,防止棧溢出攻擊,但解析超過 500 層的嵌套 JSON 時(shí)會(huì)拋出 StreamConstraintsException,需調(diào)整超大嵌套 JSON 的解析限制。 |
| StreamWriteConstraints | DEFAULT_MAX_DEPTH | 1000 | 500 | JSON 嵌套序列化的最大深度從 1000 降至 500;序列化深層嵌套對(duì)象(如遞歸引用的對(duì)象)時(shí)會(huì)提前終止,需優(yōu)化對(duì)象結(jié)構(gòu),或通過 StreamWriteConstraints.builder().maxDepth(1000) 調(diào)整限制。 |
4. 功能拆分與遷移
- 流式 API 特性拆分: JsonParser.Feature → StreamReadFeature(通用)+ JsonReadFeature(JSON 專用); JsonGenerator.Feature → StreamWriteFeature + JsonWriteFeature(其他格式如 XML/YAML 同理)。
- 遷移配置:
| 屬性/方法 | 原位置 | 遷移位置 |
|---|---|---|
| ADJUST_DATES_TO_CONTEXT_TIME_ZONE | DeserializationFeature | DateTimeFeature |
| READ_DATE_TIMESTAMPS_AS_NANOSECONDS | DeserializationFeature | DateTimeFeature |
| FAIL_ON_NUMBERS_FOR_ENUMS | DeserializationFeature | EnumFeature |
| READ_ENUMS_USING_TO_STRING | DeserializationFeature | EnumFeature |
| READ_UNKNOWN_ENUM_VALUES_AS_NULL | DeserializationFeature | EnumFeature |
| READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE | DeserializationFeature | EnumFeature |
| WRITE_DATES_AS_TIMESTAMPS | SerializationFeature | DateTimeFeature |
| WRITE_DATE_KEYS_AS_TIMESTAMPS | SerializationFeature | DateTimeFeature |
| WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS | SerializationFeature | DateTimeFeature |
| WRITE_DATES_WITH_CONTEXT_TIME_ZONE | SerializationFeature | DateTimeFeature |
| WRITE_DURATIONS_AS_TIMESTAMPS | SerializationFeature | DateTimeFeature |
| WRITE_DATES_WITH_ZONE_ID | SerializationFeature | DateTimeFeature |
| WRITE_ENUMS_USING_TO_STRING | SerializationFeature | EnumFeature |
| WRITE_ENUMS_USING_INDEX | SerializationFeature | EnumFeature |
| WRITE_ENUM_KEYS_USING_INDEX | SerializationFeature | EnumFeature |
| createContextual() | ContextualDeserializer | ValueDeserializer |
| createContextual() | ContextualSerializer | ValueSerializer |
| resolve() | ResolvableDeserializer | ValueDeserializer |
| resolve() | ResolvableSerializer | ValueSerializer |
三、注意事項(xiàng)(避坑關(guān)鍵)
1. 依賴管理建議
優(yōu)先使用 jackson-bom 統(tǒng)一版本(避免 jackson-annotations 版本沖突):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>tools.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>3.0.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>無需手動(dòng)引入 jackson-core 和 jackson-annotations,jackson-databind 會(huì)自動(dòng)傳遞依賴。
2. 代碼改造注意
ObjectMapper 構(gòu)建: 必須用 Builder 模式,示例:
// 3.x 正確寫法
JsonMapper mapper = JsonMapper.builder()
.enable(JsonWriteFeature.ESCAPE_NON_ASCII)
.changeDefaultPropertyInclusion(incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL))
.build();
// 重新配置已有 mapper(不可變對(duì)象無法直接修改)
JsonMapper newMapper = mapper.rebuild()
.enable(SerializationFeature.INDENT_OUTPUT)
.build();
泛型類型校驗(yàn): LaissezFaireSubTypeValidator 不再公開,需用 BasicPolymorphicTypeValidator 構(gòu)建:
BasicPolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder()
.allowIfSubType("com.example")
.build();
日期格式/時(shí)區(qū)配置: UTC 的默認(rèn)形式現(xiàn)在尾部是 Z ,而不是像 2.x 版本中的 +00 。
//錯(cuò)誤的方式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"));
mapper.setTimeZone(TimeZone.getDefault());
//正確的方式
ObjectMapper mapper = JsonMapper.builder()
.defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"))
.defaultTimeZone(TimeZone.getDefault())
.build();
序列化配置:
//錯(cuò)誤的方式 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //正確的方式 ObjectMapper mapper = JsonMapper.builder() .changeDefaultPropertyInclusion(incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL)) .changeDefaultPropertyInclusion(incl -> incl.withContentInclusion(JsonInclude.Include.NON_NULL)) .build();
可見性配置: MapperFeature.AUTO_DETECT_XXX 已移除,需通過 changeDefaultVisibility 配置:
//錯(cuò)誤的方式
mapper.disable(MapperFeature.AUTO_DETECT_FIELDS);
//正確的方式
ObjectMapper mapper = JsonMapper.builder()
.changeDefaultVisibility(vc ->
vc.withFieldVisibility(JsonAutoDetect.Visibility.NONE))
.build();
包含類型信息配置:
//錯(cuò)誤的方式
mapper.activateDefaultTypingAsProperty(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS,
"@class");
//正確的方式
var typeValidator = BasicPolymorphicTypeValidator.builder()
.allowIfSubType("my.package.base.name.")
.allowIfSubType("java.util.concurrent.")
.allowIfSubTypeIsArray()
// ...
.build();
ObjectMapper mapper = JsonMapper.builder()
.activateDefaultTypingAsProperty(typeValidator, DefaultTyping.NON_CONCRETE_AND_ARRAYS, "@class")
.build();
JsonNode 處理中的 DecimalNode 創(chuàng)建策略 通過 JsonNodeFactory 創(chuàng)建 DecimalNode 時(shí),舊行為:可能會(huì)自動(dòng)截?cái)辔搽S零(如 1.200 → 1.2)新行為:默認(rèn)不截?cái)辔搽S零,保持最小限度修剪
// 示例:不同的表示方式
BigDecimal value1 = new BigDecimal("1.200"); // 三位小數(shù)
BigDecimal value2 = new BigDecimal("1.2"); // 一位小數(shù)
// 新行為:DecimalNode會(huì)保持原始精度
// value1 仍會(huì)表示為 "1.200"
// value2 仍會(huì)表示為 "1.2"
Month 序列化/反序列化行為變更
// java.time.Month 枚舉
public enum Month {
JANUARY, // 1
FEBRUARY, // 2
// ...
DECEMBER // 12
}
// Jackson 2.x 序列化結(jié)果(默認(rèn))
{"month": "JANUARY"} // 或使用索引:{"month": 0}
// Jackson 3.x 序列化結(jié)果(默認(rèn))
{"month": 1} // 直接使用 Month 的數(shù)值(1-12)
3. 性能優(yōu)化點(diǎn)
關(guān)閉末尾字符校驗(yàn): 若輸入數(shù)據(jù)可信,可禁用 FAIL_ON_TRAILING_TOKENS 減少開銷:
JsonMapper.builder().disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS).build();
緩沖區(qū)回收配置: 3.x 默認(rèn)使用雙端隊(duì)列回收池,高并發(fā)場(chǎng)景可切換回 2.x 的 ThreadLocal 池:
JsonFactory factory = JsonFactory.builder() .recyclerPool(JsonRecyclerPools.threadLocalPool()) .build(); JsonMapper mapper = JsonMapper.builder(factory).build();
4. 兼容性適配
- 若需保留 2.x 部分默認(rèn)行為,可使用 JsonMapper.builderWithJackson2Defaults() 快速遷移(但無法覆蓋所有配置)。
- 單元測(cè)試需重點(diǎn)檢查:字段序列化順序、日期格式、未知字段處理、枚舉序列化方式等受默認(rèn)配置變更影響的場(chǎng)景。
5. 生態(tài)支持
- Spring 已在 2025.10 版本支持 Jackson 3.x(需升級(jí) Spring 相關(guān)依賴)。
- 可使用 OpenRewrite 工具自動(dòng)完成部分遷移(參考:docs.openrewrite.org/recipes/jav…
總結(jié)
Jackson 3.x 遷移的核心是 “環(huán)境升級(jí) + 依賴變更 + Builder 模式適配 + 廢棄 API 替換”,關(guān)鍵在于處理包名、不可變對(duì)象構(gòu)建和默認(rèn)配置變更帶來的兼容性問題。建議先升級(jí) JDK 17,再通過依賴替換、代碼批量改造(重點(diǎn)是 ObjectMapper 構(gòu)建和異常處理)、單元測(cè)試驗(yàn)證逐步完成遷移,優(yōu)先使用官方提供的 Builder 方法和兼容工具減少手動(dòng)改造成本。
到此這篇關(guān)于Jackson3遷移核心注意點(diǎn)總結(jié)大全的文章就介紹到這了,更多相關(guān)Jackson3遷移注意點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java項(xiàng)目中讀取properties文件
本篇文章主要介紹了Java項(xiàng)目中讀取properties文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
Spring?Boot實(shí)現(xiàn)分布式任務(wù)調(diào)度的步驟
Spring?Boot提供了一些工具和框架,可以幫助我們輕松地實(shí)現(xiàn)分布式任務(wù)調(diào)度,在本文中我們將介紹如何使用Spring?Boot、Spring?Cloud、Quartz和Redis來實(shí)現(xiàn)分布式任務(wù)調(diào)度,感興趣的朋友跟隨小編一起看看吧2023-06-06
Java Lambda List轉(zhuǎn)Map代碼實(shí)例
這篇文章主要介紹了Java Lambda List轉(zhuǎn)Map代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
SpringMVC實(shí)現(xiàn)文件上傳下載的全過程
對(duì)于上傳功能,我們?cè)陧?xiàng)目中是經(jīng)常會(huì)用到的,比如用戶注冊(cè)的時(shí)候,上傳用戶頭像,這個(gè)時(shí)候就會(huì)使用到上傳的功能,而對(duì)于下載使用場(chǎng)景也很常見,下面這篇文章主要給大家介紹了關(guān)于SpringMVC實(shí)現(xiàn)文件上傳下載的相關(guān)資料,需要的朋友可以參考下2022-01-01
Java Scala數(shù)據(jù)類型與變量常量及類和對(duì)象超詳細(xì)講解
本文內(nèi)容主要分為3節(jié),依次講解:Scala的數(shù)據(jù)類型有哪些? 變量常量如何使用? 類和對(duì)象如何理解? 受限于博主的大腦容量,大概是無法做到事無巨細(xì)的,不過其實(shí)也沒必要那么"細(xì)",抓住主要脈絡(luò),加上大量的練習(xí),融會(huì)貫通只不過是時(shí)間的問題2022-12-12
Spring Cloud使用Feign進(jìn)行遠(yuǎn)程調(diào)用的操作指南
本文介紹了Feign作為聲明式HTTP客戶端在SpringCloud中的使用,從簡(jiǎn)介、對(duì)比RestTemplate的問題、使用步驟,到日志配置、性能優(yōu)化和實(shí)際應(yīng)用進(jìn)行了詳細(xì)講解,包括如何通過Feign簡(jiǎn)化接口調(diào)用,以及解決啟動(dòng)時(shí)找不到FeignClient的問題,需要的朋友可以參考下2025-02-02
Eclipse中Debug時(shí)鼠標(biāo)懸停不能查看變量值解決辦法
這篇文章主要介紹了Eclipse中Debug時(shí)鼠標(biāo)懸停不能查看變量值解決辦法,以及分享了一個(gè)簡(jiǎn)單補(bǔ)全代碼的方法,還是比較不錯(cuò)的,需要的朋友可以參考下。2017-11-11

