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

如何让javax.ws.rs.client.Client将本地JSON文件作为伪服务数据源

报错原因

Jersey REST客户端的默认实现仅支持HTTP/HTTPS协议,底层基于HttpURLConnection实现。当你传入file协议的URL时,JDK会生成对应文件协议的URLConnection实现,不属于HttpURLConnection子类,强制转换就会抛出你遇到的异常。你遇到的识别为FTP协议的问题是因为本地文件URL格式写错了,正确本地文件URL格式为file:///绝对路径,但即使格式正确,默认的Jersey客户端依然无法支持file协议。

解决方案

方案1:最小改动直接读取本地文件反序列化(最推荐,适合单测场景)

你已经引入了Jackson相关依赖,直接用Jackson反序列化本地JSON文件即可,后续处理逻辑完全不用修改:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;

// 读取本地JSON文件直接反序列化为目标类
ObjectMapper objectMapper = new ObjectMapper();
MyClass result = objectMapper.readValue(new File("somepath/MyTest.json"), MyClass.class);

// 后续原来的处理逻辑完全不变

方案2:保留原有Client调用逻辑不修改(适合集成测试场景)

如果不想修改原有业务代码的调用流程,可以用Mock工具模拟Client的返回结果,示例用Mockito实现:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.mockito.Mockito;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import java.io.File;

// 先读取本地文件得到预期返回结果
ObjectMapper objectMapper = new ObjectMapper();
MyClass mockResult = objectMapper.readValue(new File("somepath/MyTest.json"), MyClass.class);

// Mock整个调用链路的对象
Client mockClient = Mockito.mock(Client.class);
WebTarget mockWebTarget = Mockito.mock(WebTarget.class);
Invocation.Builder mockBuilder = Mockito.mock(Invocation.Builder.class);

Mockito.when(mockClient.target(Mockito.anyString())).thenReturn(mockWebTarget);
Mockito.when(mockWebTarget.request(MediaType.APPLICATION_JSON)).thenReturn(mockBuilder);
Mockito.when(mockBuilder.get(MyClass.class)).thenReturn(mockResult);

// 后续业务代码直接使用这个mockClient,完全不需要修改原有调用逻辑

内容的提问来源于stack exchange,提问作者djna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:48:04