ReastEasy 4客户端所需依赖及配置报错问题求助
解决Resteasy 4客户端依赖与报错问题
我帮你梳理下Resteasy 4.x客户端所需的正确依赖,以及解决你遇到的几个报错的具体方案:
Resteasy 4.x的核心依赖变化
Resteasy 4.x对3.x的模块做了拆分,原来的resteasy-jaxrs被拆分成多个独立模块,客户端开发必须的基础依赖是:
resteasy-core: 包含核心的JAX-RS实现、SPI和基础工具类,是客户端运行的基础resteasy-client: 客户端的具体实现,包含ResteasyClientBuilder等核心类,是解决你第一个报错的关键resteasy-jackson2-provider: 如果你需要处理JSON序列化/反序列化(请求或响应),这个依赖是必须的,负责Java对象与JSON的互相转换
逐个解决你的报错
1. ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder
这个报错的根源是:你只引入了resteasy-core-spi和resteasy-client-api(都是接口/抽象层模块),没有引入实际的客户端实现模块resteasy-client。JAX-RS会通过SPI机制查找ClientBuilder的实现类,找不到Resteasy的实现时,就会尝试查找其他JAX-RS提供者(比如Jersey),但你没引入Jersey,所以抛出这个异常。
解决方法:确保引入resteasy-client依赖(你已经添加了,只要和其他Resteasy版本保持一致的4.5.8.Final就没问题)。
2. RESTEASY003215: could not find writer for content-type application/json type: java.lang.String
这个报错有两个主要原因,结合你的代码来看:
- 原因一:缺少
resteasy-core依赖:resteasy-jackson2-provider依赖于resteasy-core中的核心类,没有它的话,Jackson Provider无法被正确加载,同时Resteasy默认的StringMessageBodyWriter也无法生效。 - 原因二:媒体类型与数据类型不匹配:你的代码里写的是
MediaType.TEXT_PLAIN,但报错提示的是application/json,说明你可能实际调用时用了MediaType.APPLICATION_JSON。如果是发送String类型的JSON字符串,其实不需要Jackson,直接用Resteasy默认的StringMessageBodyWriter即可,但需要确保resteasy-core存在;如果是发送Java对象转JSON,那应该用Jackson Provider,并且确保对象被正确序列化。
解决方法:
- 必须引入
resteasy-core依赖(你之前注释掉了,要取消注释) - 根据需求调整媒体类型:
- 如果发送的是JSON格式的字符串:可以继续用
MediaType.TEXT_PLAIN,或者用MediaType.APPLICATION_JSON(此时需要resteasy-core存在,默认的StringWriter会处理) - 如果发送的是Java对象:直接传入对象,用
MediaType.APPLICATION_JSON,Jackson Provider会自动完成序列化
- 如果发送的是JSON格式的字符串:可以继续用
完整的build.gradle配置
这里给你整理好正确的依赖配置,确保所有Resteasy版本统一:
repositories { jcenter() mavenCentral() } apply plugin: 'java' apply plugin: 'eclipse' sourceCompatibility = 14 targetCompatibility = 14 ext.resteasyVersion = "4.5.8.Final"; dependencies { // Resteasy 4.x客户端核心依赖 compile "org.jboss.resteasy:resteasy-core:$resteasyVersion" compile "org.jboss.resteasy:resteasy-client:$resteasyVersion" // JSON序列化/反序列化支持 compile "org.jboss.resteasy:resteasy-jackson2-provider:$resteasyVersion" compileOnly "org.projectlombok:lombok:1.18.12" annotationProcessor 'org.projectlombok:lombok:1.18.12' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2' testCompile 'org.junit.platform:junit-platform-launcher:1.5.2' }
调用代码的注意事项
如果你的state是Java对象,建议直接传入对象,让Jackson自动处理,不用手动用ObjectMapper转成String:
// 直接传入Java对象,使用APPLICATION_JSON媒体类型 Entity entity = Entity.entity(state, MediaType.APPLICATION_JSON); Response response = target.request().put(entity);
如果必须手动转成String发送,要确保媒体类型和内容匹配:
String stateString = MAPPER.writeValueAsString(state); // 如果是JSON字符串,用APPLICATION_JSON Entity entity = Entity.entity(stateString, MediaType.APPLICATION_JSON); // 或者用TEXT_PLAIN(如果服务端接受文本格式) // Entity entity = Entity.entity(stateString, MediaType.TEXT_PLAIN); Response response = target.request().put(entity);
内容的提问来源于stack exchange,提问作者user1803551




