升级Spring 6调用JacksonJsonProvider.setMapper时无法访问MessageBodyReader
解决Spring 6 + Jersey 3.1.0 + Jackson JSON Provider 编译错误问题
核心原因
Spring 6 基于**Jakarta EE 9+**规范,所有原javax.*包已迁移至jakarta.*包。你当前使用的com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.14.1是针对旧版javax.ws.rs的依赖,与兼容Jakarta EE的Jersey 3.x不匹配,直接导致javax.ws.rs.ext.MessageBodyReader无法找到、JacksonJsonProvider.setMapper()编译失败。
解决方案
1. 替换Jackson的Jakarta兼容依赖
移除旧的Jackson JAX-RS依赖,改用适配Jakarta EE的版本:
<!-- 删除原依赖 --> <!-- <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.14.1</version> </dependency> --> <!-- 添加Jakarta兼容版依赖 --> <dependency> <groupId>com.fasterxml.jackson.jakarta.rs</groupId> <artifactId>jackson-jakarta-rs-json-provider</artifactId> <version>2.14.1</version> </dependency>
2. 修正代码导入路径
将代码中所有javax.ws.rs相关导入替换为jakarta.ws.rs,同时更新Jackson Provider的导入:
// 旧导入(删除) // import javax.ws.rs.ext.MessageBodyReader; // import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; // 新导入 import jakarta.ws.rs.ext.MessageBodyReader; import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
3. 验证setMapper()方法使用
替换依赖和导入后,JacksonJsonProvider.setMapper()可正常编译,示例代码:
JacksonJsonProvider jsonProvider = new JacksonJsonProvider(); ObjectMapper customMapper = new ObjectMapper(); // 自定义Mapper配置(示例:忽略未知属性) customMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jsonProvider.setMapper(customMapper);
4. 确保Jersey依赖一致性
确认所有Jersey依赖均为GlassFish提供的Jakarta兼容版本,避免混合javax和jakarta依赖:
<!-- Jersey核心依赖示例 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>3.1.0</version> </dependency>
关键注意事项
- Spring 6及后续版本完全抛弃
javax包API,所有JAX-RS、Servlet相关组件必须切换到jakarta包版本。 - Jackson的Jakarta版本groupId从
com.fasterxml.jackson.jaxrs变更为com.fasterxml.jackson.jakarta.rs,artifactId同步调整,注意版本号保持一致(如示例中的2.14.1)。
内容的提问来源于stack exchange,提问作者Suhail Ahmed
相关产品推荐
相关产品推荐

