2011-05-13 2 views
1

저는 편안한 웹 서비스를 위해 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

아이디어가 있으십니까?

답변

1

CXF JAX-RS에 @XmlRootElement 주석이없는 명시 적 Bean 콜렉션을 읽는 것과 관련된 버그가있을 수 있습니다.

이 문제는 CXF에서 해결
+0

추가 JAXB 주석을 MBean의 클래스를 자격이 그것을 해결 한 것으로 보인다. 나는 이것을 할 필요가 없기를 바랐다. – Qwerky

2

하나의 옵션은 웹 클라이언트를 주입하고,이 경우, 사용하는 것입니다 지금까지이 예외에 관한 한

webClient.getCollection(MyBean.class); 

:

당신이 사용하는 어떤 CXF 버전? 명시 적 컬렉션을 읽는 데 필요한 많은 테스트가 있습니다 ...

MBean이 XMLRootElement로 규정되지 않았습니까?

0

하는 workround로

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()); 
} 
관련 문제