Jersey客户端调用REST接口返回HTML而非JSON故障求助
解决Jersey客户端调用REST接口返回HTML而非JSON的问题
看起来你遇到的问题很典型——工具调用正常但代码里返回HTML,大概率是请求头或者客户端配置的问题,我来帮你梳理几个排查方向:
1. 确保Jersey客户端发送了正确的Accept请求头
Postman/ARC这类工具会自动帮你添加Accept: application/json请求头,但Jersey客户端默认可能不会。服务器如果没收到这个头,可能会返回默认的HTML格式(比如错误页面或者默认视图)。
你可以在客户端请求里明确指定这个头:
Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://你的API地址/userJSON2/" + preRegisterId); // 明确要求接受JSON格式 Response response = target.request(MediaType.APPLICATION_JSON) .get(); // 解析响应为目标对象 PreRegisterJsonResponse result = response.readEntity(PreRegisterJsonResponse.class);
2. 检查Jersey客户端是否注册了JSON提供者
如果你的客户端没有配置JSON处理的提供者,不仅无法正确解析JSON响应,服务器也可能因为识别不到客户端支持的格式而返回HTML。你需要注册Jackson的JSON提供者(假设项目用Jackson处理JSON):
ClientConfig config = new ClientConfig(); // 注册Jackson JSON提供者 config.register(JacksonJaxbJsonProvider.class); Client client = ClientBuilder.newClient(config);
如果是Maven项目,记得添加对应的Jersey JSON依赖:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>你的Jersey版本号</version> </dependency>
3. 给接口明确添加produces属性
虽然你用了@ResponseBody,但给@RequestMapping加上produces属性可以强制服务器只返回JSON,避免格式歧义:
@GET @ResponseBody @RequestMapping(value = "/userJSON2/{preRegisterId}", produces = MediaType.APPLICATION_JSON_VALUE) public PreRegisterJsonResponse userJson2(@PathVariable long preRegisterId) { // 你的业务逻辑代码 }
4. 先排查返回的HTML具体内容
把返回的HTML打印出来看看,说不定是404路径错误、参数类型不匹配导致的500错误页面?比如你代码里传递的preRegisterId格式不对,或者路径拼接有误:
Response response = target.request(MediaType.APPLICATION_JSON).get(); String htmlContent = response.readEntity(String.class); System.out.println(htmlContent); // 打印HTML内容,定位具体问题
按照这几个步骤排查,应该能快速定位并解决问题~
内容的提问来源于stack exchange,提问作者Mithilesh Tipkari




