You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jackson 3.x版本中com.fasterxml.jackson.module.kotlin.jacksonObjectMapper是否已移除?如何升级旧Kotlin代码适配最新Jackson依赖?

Jackson 3.x版本中com.fasterxml.jackson.module.kotlin.jacksonObjectMapper是否已移除?如何升级旧Kotlin代码适配最新Jackson依赖?

别担心,jacksonObjectMapper() 并没有被移除!问题出在Jackson 3.x版本对groupId和包结构做了重大调整——从原来的com.fasterxml迁移到了tools.jackson,所以你找不到原来的导入路径是完全正常的。下面一步步帮你完成升级:

1. 先修正Jackson依赖坐标

首先要把所有Jackson相关依赖的groupId从com.fasterxml.jackson替换为tools.jackson,以Kotlin模块为例:

Gradle 依赖示例

dependencies {
    // 替换旧的jackson-module-kotlin
    implementation("tools.jackson.module:jackson-module-kotlin:2.16.1") // 建议使用最新稳定版
    // 同步替换Jackson核心模块
    implementation("tools.jackson.core:jackson-databind:2.16.1")
}

Maven 依赖示例

<dependency>
    <groupId>tools.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.16.1</version>
</dependency>
<dependency>
    <groupId>tools.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.16.1</version>
</dependency>

⚠️ 关键提醒:确保项目中所有Jackson相关依赖(databind、core、annotations等)都统一使用tools.jackson的groupId,绝对不要混合com.fasterxmltools.jackson,否则会出现类加载冲突!

2. 调整代码中的导入语句

把所有Jackson相关的包路径从com.fasterxml替换为tools.jackson

  • 原导入 com.fasterxml.jackson.databind.ObjectMapper → 改为 tools.jackson.databind.ObjectMapper
  • 原导入 com.fasterxml.jackson.module.kotlin.jacksonObjectMapper → 改为 tools.jackson.module.kotlin.jacksonObjectMapper

3. 修正后的完整代码

下面是你提供的代码修改后的适配版本,所有Jackson相关的包和初始化逻辑都已调整为3.x规范:

import tools.jackson.databind.ObjectMapper
import tools.jackson.module.kotlin.jacksonObjectMapper
import org.apache.commons.lang3.StringUtils.isEmpty
import org.togglz.core.Feature
import org.togglz.core.manager.FeatureManager
import java.util.*

inline fun <reified E: Enum<E>> getEnumFromMapOfStrings(map: Map<String, Any>, key:String, defaultValue:E): E {
    return java.lang.Enum.valueOf(E::class.java, (map.getOrDefault(key, defaultValue.name) as String))
}

fun FeatureManager.isNotActive(feature: Feature) = this.isActive(feature).not()

@JvmField val JACKSON_OBJECT_MAPPER: ObjectMapper = jacksonObjectMapper()

class JoshworksJacksonObjectMapper: io.joshworks.restclient.http.mapper.ObjectMapper {
    override fun writeValue(value: Any?): String? {
        return JACKSON_OBJECT_MAPPER.writeValueAsString(value)
    }

    override fun <T : Any?> readValue(value: String?, valueType: Class<T>?): T? {
        return if (isEmpty(value)) null else JACKSON_OBJECT_MAPPER.readValue(value, valueType)
    }
}

@JvmField val JOSHWORKS_JACKSON_OBJECT_MAPPER:
        io.joshworks.restclient.http.mapper.ObjectMapper = JoshworksJacksonObjectMapper()

fun <T> Iterable<T>.takeUntilIncluding(predicate: (T) -> Boolean): List<T> {
    val list = ArrayList<T>()
    for (item in this) {
        list.add(item)
        if (predicate(item)) {
            break
        }
    }
    return list
}

额外注意事项

  1. Kotlin版本兼容性:最新的jackson-module-kotlin需要至少Kotlin 1.8.x以上版本,你的项目原来用的是1.4,建议同步升级Kotlin到1.8+或1.9+,避免出现语法或API兼容性问题。
  2. 第三方依赖适配:你代码中用到的io.joshworks.restclient如果依赖旧版Jackson(com.fasterxml),可能会出现冲突。可以检查该库是否有适配Jackson 3.x的版本,或者在依赖声明中排除它的Jackson依赖,强制使用你的tools.jackson版本。
  3. 全局替换包名:如果项目中很多地方用到了旧的Jackson包名,可以用IDE的全局替换功能(比如IntelliJ的Edit → Find → Replace in Path),把com.fasterxml.jackson批量替换为tools.jackson,效率会高很多。

这样调整后,你的代码就能正常使用Jackson 3.x的jacksonObjectMapper(),并且和之前的功能完全一致啦!如果还有其他冲突或报错,欢迎补充细节再讨论~

火山引擎 最新活动