【问题标题】:How do I get a CXF client to understand a List?如何让 CXF 客户理解列表?
【发布时间】:2011-05-13 14:57:23
【问题描述】:

我将 Apache CXF 用于我的宁静 Web 服务。我有一个由返回我的 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,内容类型: 应用程序/xml。
....
造成的: javax.ws.rs.WebApplicationException: java.lang.ClassCastException: com.example.MyBean 不能转换为 org.apache.cxf.jaxrs.provider.AbstractJAXBProvider$CollectionWrapper

有什么想法吗?

【问题讨论】:

    标签: java cxf jax-rs


    【解决方案1】:

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

    webClient.getCollection(MyBean.class);
    

    就这个例外而言:

    您使用的是哪个 CXF 版本? 我们有很多测试来读取显式集合...

    MBean 不符合 XMLRootElement 的条件吗?

    【讨论】:

      【解决方案2】:

      CXF JAX-RS 中可能存在一个错误,与读取没有 @XmlRootElement 注释的显式 bean 集合有关,并对其进行调查。

      【讨论】:

      • 添加了 JAXB 注释,这似乎已经修复了它。不过,我希望不必这样做。
      【解决方案3】:
      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());
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多