저는 편안한 웹 서비스를 위해 Apache CXF를 사용하고 있습니다. 내 콩 목록을 반환하는 인터페이스에 의해 정의 된 서비스가 있습니다.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>
클라이언트가 호출 될 때이 스택 추적을받습니다.
org.apache.cxf.jaxrs.client.ClientWebApplicationException : 응답 메시지를 읽는와 .Problem, 클래스 : 인터페이스 를 java.util.List, ContentType을 : 응용 프로그램/XML.
....
에 의한는 : 는 javax.ws.rs.WebApplicationException : java.lang.ClassCastException가 : com.example.MyBean 는 org.apache.cxf.jaxrs.provider.AbstractJAXBProvider 캐스트 할 수없는 $ CollectionWrapper
아이디어가 있으십니까?
추가 JAXB 주석을 MBean의 클래스를 자격이 그것을 해결 한 것으로 보인다. 나는 이것을 할 필요가 없기를 바랐다. – Qwerky