【问题标题】:How create a java object from CXF Webclient response如何从 CXF Webclient 响应创建一个 java 对象
【发布时间】:2014-12-10 19:19:29
【问题描述】:

我正在为用 Apache CXF 编写的可用 REST API(比如 API Y)编写一个包装 REST API(比如 API X)。对于包装器,我使用的是 CXF Webclient。这就是我从 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

可能是因为类包名不同?

有人可以帮我得到对用户对象的响应吗?

【问题讨论】:

    标签: java cxf web-client


    【解决方案1】:

    看起来您的回复是 JSON 格式,对吗?您需要将响应中的 JSON 字节流转换为 Java 类。您正在尝试将 Stream 类转换为您的用户类,这显然是行不通的。您需要从数据流中解析 JSON,然后将 JSON 反序列化为您的用户类。有一些库可以提供帮助,包括 JacksonGSON

    This guy 有一个使用 Jackson ObjectMapper 类的简单示例 - ObjectMapper 类有一个包含 InputStream 参数的readValue method

    【讨论】:

    • 感谢您的回答。我已经使用过 GSON 并完成了这项工作。
    • 我认为 CXF 中应该有一种隐式方式来将响应转换为 java 对象,而不使用 3rd 方库。因此问题。
    • 在 CXF 中,您可以使用 JAXB 将 XML 转换为 Java,但不要认为 JSON 有任何作用。不过,我会得到纠正。
    • @CodeClimber:使用 CXF 绝对可以将 JSON 转换为 Java。默认情况下,CXF 使用 Jettison 进行转换。您可以交换其他解析器,例如 Jackson。有趣的是,您仍然使用 JAXB 注释。
    【解决方案2】:

    不需要做任何额外的事情。

    如果是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);
    

    【讨论】:

    • 我如何发布 json 对象
    • 这将返回 JSON 对象
    • inside post 我应该发布什么(instatanceOfTypeOfObject 可以是 json)
    【解决方案3】:

    杰克逊提供者是一个解决方案:

     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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      相关资源
      最近更新 更多