如何从CXF Web客户端响应创建java对象



我正在为用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);

最新更新