Как мне заставить клиента CXF понять список? - PullRequest
1 голос
/ 13 мая 2011

Я использую Apache CXF для моих спокойных веб-сервисов.У меня есть служба, определенная интерфейсом, который возвращает список моего компонента.

@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 вызвать службу.

В моем клиентском приложении я объявляю клиента со следующей весенней конфигурацией:

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

Когда клиент вызываетсяЯ получаю этот стек;1015 * ....
Причина: javax.ws.rs.WebApplicationException: java.lang.ClassCastException: com.example.MyBean нельзя преобразовать в org.apache.cxf.jaxrs.provider.AbstractJAXBProvider $ CollectionWrapper

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 16 мая 2011

Один из вариантов - ввести WebClient и использовать, в этом случае,

webClient.getCollection(MyBean.class);

Что касается этого исключения:

Какую версию CXF вы используете?У нас есть много тестов для чтения явных коллекций ...

Разве MBean не квалифицируется как XMLRootElement?

1 голос
/ 13 августа 2015
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());
}
1 голос
/ 16 мая 2011

В CXF JAX-RS может быть ошибка, связанная с чтением явных коллекций bean-компонентов, у которых нет аннотаций @XmlRootElement.

0 голосов
/ 17 мая 2011

Эта проблема исправлена ​​в CXF, квалифицируйте класс MBean как рабочую среду

...