如何让CXF客户端了解列表?

时间:2011-05-13 14:57:23

标签: java cxf jax-rs

我正在使用Apache CXF来提供我的宁静网络服务。我有一个由返回我的bean列表的接口定义的服务。

@Path("/")
@Produces("application/xml")
public interface MyService {

  @GET
  @Path("/test")
  public List<MyBean> getBeans() throws IOException;

}

..并且服务实现就是这样;

public class MyServiceImpl implements MyService {
  public List<MyBean> getBeans() {
     ArrayList<MyBean> beans = new ArrayList<MyBean>();
     beans.add(new MyBean("foo", "bar");
     return beans;
  }
}

这部署在我的服务器上并且运行正常。我可以在浏览器中点击该服务并获得我期望的结果。问题是当我尝试让CXF客户端调用该服务时。

在我的客户端应用程序中,我使用以下spring配置声明客户端;

  <jaxrs:client id="myClient" inheritHeaders="true"
                 address="myhost/test"
                 serviceClass="com.example.MyService">
     <jaxrs:headers>
       <entry key="Accept" value="application/xml"/>
     </jaxrs:headers>
     <jaxrs:providers>
       <ref bean="myJaxbXmlProvider"/>
       <ref bean="myJsonProvider"/>
     </jaxrs:providers>  
   </jaxrs:client>

   <bean id="myJaxbXmlProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
     <property name="jaxbElementClassMap" ref="myElementClassMap"/>
   </bean>
   <bean id="myJsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
     <property name="jaxbElementClassMap" ref="myElementClassMap"/>
   </bean>
   <util:map id="myElementClassMap">
     <entry key="com.example.MyBean" value="bean"/>
   </util:map>

当调用客户端时,我得到了这个堆栈跟踪;

  

org.apache.cxf.jaxrs.client.ClientWebApplicationException:   。阅读回复的问题   消息,类:接口   java.util.List,ContentType:   应用/ XML。
  ....
  引起:   javax.ws.rs.WebApplicationException:   java.lang.ClassCastException:   com.example.MyBean   无法施展   org.apache.cxf.jaxrs.provider.AbstractJAXBProvider $ CollectionWrapper

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

一种选择是注入WebClient并在这种情况下使用

webClient.getCollection(MyBean.class);

就这个例外而言:

您使用的CXF版本是什么? 我们有很多关于阅读显式集合的测试......

MBean是否未被限定为XMLRootElement?

答案 1 :(得分:1)

在CXF JAX-RS中可能存在一个错误,即读取没有@XmlRootElement注释的显式bean集合,并查看它。

答案 2 :(得分:1)

List<Object> providers = new ArrayList<Object>();
providers.add( new JacksonJaxbJsonProvider() );

WebClient  client=WebClient.create("http://localhost:6969/CXF3/rest",providers);

client = client.accept("application/json").type("application/json").path("/service/getAll");

Collection<? extends Person> order=client.getCollection(Person.class);

for(Person p:order){
  System.out.println(p.getEname()+" "+p.getEmpid()+" "+p.getEsal());
}

答案 3 :(得分:0)

此问题已在CXF中修复,将MBean类限定为workround