You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jersey Client开发REST客户端时Content-Type头相关异常求助

解决Jersey客户端添加Content-Type头报错与415 Unsupported Media Type问题

看起来你遇到了一个典型的Jersey客户端配置和API使用冲突问题——既然Postman和SOAPUI能正常通信,说明服务器端的要求是明确的,问题肯定出在你的Java代码实现细节上。我来帮你拆解可能的原因和对应的解决方案:

核心问题分析

你遇到的矛盾点(加头抛UnsupportedOperationException,不加返回415)通常来自两个常见误区:

  1. 错误的请求头设置方式:尝试在不可变的请求对象上修改头信息
  2. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:20:05