如何让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
相关产品推荐
相关产品推荐

