升级Retrofit 2.9.1与OkHttp 3.X.X时Json转换器库报错求解决
问题根源
你目前使用的org.codehaus.jackson:jackson-mapper-asl:1.9.13是Jackson 1.x版本的旧库,而Retrofit 2.9.1已经适配的是更新的Jackson 2.x体系,并且Retrofit官方提供了专门的Converter模块来处理JSON序列化/反序列化。旧的Jackson 1.x库的API和新版Retrofit的Converter接口不匹配,才导致了函数、参数找不到的报错。同时,OkHttp 3.10.0升级时,建议选择和Retrofit 2.9.1兼容的稳定版本(比如3.14.9,这是Retrofit 2.9.1依赖的OkHttp版本)。
具体解决步骤
1. 移除旧的Jackson 1.x依赖
在你的build.gradle(或build.gradle.kts)中删除这一行:
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
注意:如果你的项目用的是新版Gradle,
compile已经被弃用,建议统一用implementation或api。
2. 添加Retrofit官方的Jackson Converter依赖
添加和你的Retrofit版本(2.9.1)匹配的Jackson Converter:
implementation 'com.squareup.retrofit2:converter-jackson:2.9.1'
这个包内部依赖了Jackson 2.x的核心库(com.fasterxml.jackson.core系列),不需要额外单独引入Jackson 2.x的其他包。
3. 升级OkHttp到兼容版本
将OkHttp升级到和Retrofit 2.9.1兼容的3.x版本,推荐使用3.14.9:
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
4. 修改Retrofit实例的配置代码
原来你可能是手动用旧的Jackson Mapper处理序列化,现在需要切换为Retrofit的JacksonConverterFactory:
旧代码(示例写法):
// 旧的Jackson 1.x ObjectMapper org.codehaus.jackson.map.ObjectMapper oldMapper = new org.codehaus.jackson.map.ObjectMapper(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) // 手动处理转换(旧方式) .addConverterFactory(new CustomJacksonConverter(oldMapper)) .client(okHttpClient) .build();
新代码:
// 新的Jackson 2.x ObjectMapper(来自com.fasterxml.jackson.databind包) com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); // 如果需要自定义配置,比如忽略未知字段、日期格式化等 mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) // 使用官方的JacksonConverterFactory .addConverterFactory(JacksonConverterFactory.create(mapper)) .client(okHttpClient) .build();
5. 替换代码中所有旧的Jackson API引用
把项目中所有导入的org.codehaus.jackson包替换为com.fasterxml.jackson对应的包:
- 旧的
org.codehaus.jackson.annotate.JsonProperty→ 新的com.fasterxml.jackson.annotation.JsonProperty - 旧的
org.codehaus.jackson.map.JsonMappingException→ 新的com.fasterxml.jackson.databind.JsonMappingException - 其他Jackson相关的注解、类都要切换到Jackson 2.x的包下
额外注意点
- Jackson 2.x是现在的主流维护版本,功能比1.x更完善,也解决了很多旧版本的bug
- 如果你的项目中有其他依赖还在使用Jackson 1.x,可能会出现依赖冲突,这时候需要用Gradle的
exclude功能排除掉旧的依赖,保证整个项目用的是Jackson 2.x
内容的提问来源于stack exchange,提问作者Soniya Joshi

