使用Jersey发送JSON POST请求时出现CommonConfig初始化方法不存在异常
问题根因
你遇到的java.lang.NoSuchMethodError是典型的依赖版本冲突+命名空间不兼容问题:Jersey 3.x版本全面切换到了jakarta.ws.rs命名空间,而你同时引入了旧版javax.ws.rs-api 2.0和新版jakarta.ws.rs-api 3.0,再加上重复声明的jackson-databind版本,导致类加载时加载的CommonConfig类版本不匹配,缺少对应的构造方法。
修复步骤
- 清理不兼容的依赖,删除build.gradle中旧的javax命名空间ws.rs依赖:
移除这一行:
如果你的服务端是基于javax.ws.rs的旧版本Jersey 2.x实现,则反过来删除jakarta.ws.rs的依赖,同时把jersey-client版本降到2.x系列,保证客户端和服务端命名空间一致。implementation group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0' - 统一jackson-databind版本,删除重复的版本声明:
你同时声明了2.0.1和2.11.1两个版本的jackson-databind,保留高版本的implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1'即可,删除低版本的声明。 - 添加Jersey配套的JSON序列化依赖:
Jersey需要配套的jackson provider来支持实体类的JSON序列化,添加和你jersey-client版本一致的依赖:implementation group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '3.0.0' - 同步调整代码的导入路径:
所有ws.rs相关类的导入都要和你保留的命名空间保持一致,用jakarta就全部导入jakarta.ws.rs.*下的类,用javax就全部导入javax.ws.rs.*下的类,不要混合导入。 - 清理构建缓存重新编译:
执行./gradlew clean build(Windows系统执行gradlew.bat clean build)清理旧的构建产物,避免缓存影响。
额外验证点
- 确认
GameState类以及它的内部类PiecesOnBoardSer、PiecesBeyondBoardSer都提供了公共无参构造方法和对应属性的get/set方法,否则Jackson序列化时会报错。 - 可以先手动用
ObjectMapper把GameState实例转成JSON字符串,确认序列化结果符合预期后再发起Jersey请求。
内容的提问来源于stack exchange,提问作者Lily
相关产品推荐
相关产品推荐

