使用Jersey Client开发REST客户端时Content-Type头相关异常求助
解决Jersey客户端添加Content-Type头报错与415 Unsupported Media Type问题
看起来你遇到了一个典型的Jersey客户端配置和API使用冲突问题——既然Postman和SOAPUI能正常通信,说明服务器端的要求是明确的,问题肯定出在你的Java代码实现细节上。我来帮你拆解可能的原因和对应的解决方案:
核心问题分析
你遇到的矛盾点(加头抛UnsupportedOperationException,不加返回415)通常来自两个常见误区:
- 错误的请求头设置方式:尝试在不可变的请求对象上修改头信息
- 缺少JSON媒体类型处理依赖:Jersey无法识别
application/json类型,导致设置头或序列化请求体时出错
解决方案步骤
1. 确保添加Jersey JSON处理依赖
如果你的项目是Maven管理,必须添加Jersey的JSON支持模块,否则Jersey无法处理application/json媒体类型,这会直接导致设置头时的异常或服务器返回415。在pom.xml中加入:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>你的Jersey版本号</version> </dependency>
(如果是Gradle,对应添加implementation 'org.glassfish.jersey.media:jersey-media-json-jackson:你的版本')
2. 使用正确的请求构建流程(Jersey 2.x)
你使用的org.glassfish.jersey.client.ClientResponse是响应对象,不能用来设置请求头!很多人会混淆请求构建和响应处理的API,正确的做法是通过Invocation.Builder来配置请求头:
import org.glassfish.jersey.client.ClientBuilder; import org.glassfish.jersey.jackson.JacksonFeature; import javax.ws.rs.client.Client; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; public class RestClientExample { public static void main(String[] args) { // 1. 创建客户端并注册JSON处理特性 Client client = ClientBuilder.newClient(); client.register(JacksonFeature.class); // 关键:注册JSON序列化/反序列化支持 // 2. 构建目标URL WebTarget target = client.target("你的外部服务器API地址"); // 3. 创建请求构建器,设置Accept和Content-Type头 Invocation.Builder requestBuilder = target.request(MediaType.APPLICATION_JSON) .header("Content-Type", MediaType.APPLICATION_JSON); // 正确设置请求头的方式 // 4. 发送POST请求(如果是GET可以用get()) String jsonPayload = "{\"yourKey\":\"yourValue\"}"; // 你的JSON请求体 Response response = requestBuilder.post(Entity.json(jsonPayload)); // 5. 处理响应 try { if (response.getStatus() == Response.Status.OK.getStatusCode()) { String responseBody = response.readEntity(String.class); System.out.println("响应内容:" + responseBody); } else { System.out.println("请求失败,状态码:" + response.getStatus()); System.out.println("响应信息:" + response.readEntity(String.class)); } } finally { response.close(); client.close(); } } }
3. 额外排查点
- 如果服务器要求带字符编码,可以尝试设置头为
Content-Type: application/json;charset=utf-8,替换代码中的MediaType.APPLICATION_JSON为"application/json;charset=utf-8" - 确认你的Jersey版本与依赖版本一致,避免版本不兼容问题
- 检查是否有其他拦截器或过滤器修改了请求头,导致冲突
内容的提问来源于stack exchange,提问作者Nelson Lopes
相关产品推荐
相关产品推荐

