1

我正在尝试使用 Apache CXF 实现一个 REST Web 服务,并且我想返回对象列表作为来自服务器的响应。所以我使用通用实体将我的列表包装在服务器上,当我从浏览器输入路径时一切都很好。它打印对象的 XML 表示,因为我使用了 Jackson JAX-B,但是当我尝试使用 JAX-RS 客户端时。我遇到了一个例外。

线程“主”javax.ws.rs.client.ResponseProcessingException 中的异常:读取数据时出现问题,类 XYZ,ContentType:/. 在 org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:378) 在 org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:433) 在 org.apache.cxf.jaxrs .impl.ResponseImpl.readEntity(ResponseImpl.java:325) at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:313) at XYZ.ABC() at XYZ.ABC() 原因:javax .ws.rs.core.NoContentException:消息正文在 org.apache.cxf.jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.AbstractJAXBProvider.reportEmptyContentLength(AbstractJAXBProvider.java:276) 处为空.java:166) 在 org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1325) 在 org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:369) .. . 还有 4 个

我编写了以下客户端代码来从服务器获取数据 final Client client = ClientBuilder.newClient(); WebTarget webTarget = client.target(URI.create(PATH)); Response response = webTarget.request(MediaType.APPLICATION_XML).get(); List<ABC> obj = response.readEntity(new GenericType<List<ABC>> (ABC.class){});

但除此之外,我尝试了许多代码来实现 CXF 客户端并从服务器获取数据,但我几乎总是遇到相同的异常。我也尝试过 JAXRSCLIENTFactory 来实现客户端,但同样的例外。

4

1 回答 1

0

我在使用 CXF 客户端解组时遇到了同样的问题。这是我的做法:

  1. 将响应读入字符串。
  2. 使用 Gson 将字符串转换为对象列表。

注意:您的对象列表需要一个包装类。

例子:

如果服务器返回产品列表,以下是解组列表的方法:

创建一个包装类

public class ProductList {  

private List<Product> products;

public List<Product> getProducts() {
    return products;
}

public void setProducts(List<Product> products) {
    this.products = products;
}

}

要解组的代码

String responseBody = response.readEntity(String.class);
ProductList productList = new Gson().fromJson(responseBody, ProductList.class);
if(productList.getProducts() != null)
    return productList.getProducts();
于 2015-12-22T20:07:54.593 回答