我正在为用Apache CXF编写的可用REST API(比如API Y)编写一个包装器REST API(比如API X)。对于包装器,我使用CXF Web客户端。这就是我从X调用Y的方式。
@GET
@Path("{userName}")
public Response getUser(@PathParam("userName") String userName) {
try {
WebClient client
= WebClient.create("https://localhost:8080/um/services/um");
Response response = client.path("users/" + userName)
.accept(MediaType.APPLICATION_JSON)
.get();
User user = (User) response.getEntity();
return Response.ok(user).build();
} catch (Exception e) {
return handleResponse(ResponseStatus.FAILED, e);
}
}
在这里,User类是从Y复制到X的,因为我不能使用Y作为X的依赖项。唯一的区别是包名称。现在,当我发送请求时,我在User user = (User) response.getEntity();
处得到一个类强制转换异常。
java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream cannot be cast to org.comp.rest.api.bean.User
可能是因为类包名称不同?
有人能帮我获取对用户对象的响应吗?
看起来您的响应是JSON格式的,对吗?您需要将响应中的JSON字节流转换为Java类。您正试图将流类强制转换为用户类,这显然是行不通的。您需要从数据流中解析JSON,然后将JSON反序列化到用户类中。有一些库可以提供帮助,包括Jackson和GSON
这个家伙有一个使用Jackson ObjectMapper类的简单例子——ObjectMapper类别有一个readValue方法,其中包含一个InputStream参数。
Jackson提供商是一个解决方案:
List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
WebClient client = WebClient.create("https://localhost:8080/um/services/um", providers);
User user = client.get(User.class);
不需要做任何额外的事情。
如果是GET方法
TypeOfObject response = client.path("users/" + userName)
.accept(MediaType.APPLICATION_JSON)
.get(TypeOfObject.class);
如果是POST方法
TypeOfObject response = client.path("users/" + userName)
.accept(MediaType.APPLICATION_JSON)
.post(instatanceOfTypeOfObject, TypeOfObject.class);