2012-07-18 12 views
3

我想從我的服務通過GET獲取對象數組。Apache CXF:jax-rs客戶端 - 獲取對象數組

所以,我想:

reader.setEntityClass(ObjectDTO[].class); 
res = client.get();  
List<ObjectDTO> objects = (List<ObjectDTO>) res.getEntity(); 

錯誤:

Object; cannot be cast to java.util.List 

服務:

@GET 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public List<ObjectDTO> getObjects(); 

我的依賴關係:

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-frontend-jaxrs</artifactId> 
    <version>2.6.0</version> 
</dependency> 

完整堆棧跟蹤:

 org.apache.cxf.jaxrs.client.ClientWebApplicationException: .Problem with reading the response message, class : class javax.ws.rs.core.Response, ContentType : application/xml. 
     at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:614) 
     at org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:452) 
     at org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:782) 
     at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:766) 
     at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:696) 
     at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:242) 
     at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:268) 
     at com.bachelor.cxf.CxfClientTest.getEstatesWebClient(CxfClientTest.java:313) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
     at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
     Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException: No reader for Response entity java.util.List 
     at org.apache.cxf.jaxrs.client.ResponseReader.readFrom(ResponseReader.java:92) 
     at org.apache.cxf.jaxrs.client.ResponseReader.readFrom(ResponseReader.java:77) 
     at org.apache.cxf.jaxrs.client.ResponseReader.readFrom(ResponseReader.java:40) 
     at org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:450) 
     ... 30 more 

編輯:

我嘗試另一種方法還有:

List<ObjectDTO> objects = (List<ObjectDTO>) client.get(ObjectDTO.class); 

,我也得到:

1435 [main] WARN org.apache.cxf.jaxrs.provider.AbstractJAXBProvider - javax.xml.bind.UnmarshalException 
    - with linked exception: 
    [javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"objectDTOes"). Expected elements are <{}objectDTO>] 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:332) 
     at org.apache.cxf.jaxrs.provider.JAXBElementProvider.unmarshalFromInputStream(JAXBElementProvider.java:258) 
     at org.apache.cxf.jaxrs.provider.JAXBElementProvider.doUnmarshal(JAXBElementProvider.java:215) 
     at org.apache.cxf.jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.java:182) 
     at org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:450) 
     at org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:782) 
     at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:766) 
     at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:696) 
     at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:324) 
     at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:435) 
     at com.bachelor.cxf.CxfClientTest.getEstatesWebClient(CxfClientTest.java:314) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
     at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
    Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"objectDTOes"). Expected elements are <{}objectDTO> 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1049) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:176) 
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360) 
     ... 35 more 
    Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"objectDTOes"). Expected elements are <{}objectDTO> 
     ... 45 more 

回答

4

耶,我沒有注意到getCollection方法。現在它只是:

(List<ObjectDTO>) client.getCollection(ObjectDTO.class); 

它工作正常。

1

變化:

reader.setEntityClass(Object[].class); 

到:

reader.setEntityClass(java.util.List.class); 
+0

ERROR org.apache.cxf.jaxrs.client.AbstractClient - 讀取響應消息時遇到問題,類:class javax.ws.rs.core.Response,ContentType:application/xml。 – 2012-07-18 09:11:21

+0

你可以發佈整個堆棧跟蹤嗎? (編輯問題,不要在評論中發佈) – Tomer 2012-07-18 09:19:48

+0

您使用的是什麼CXF版本? – Tomer 2012-07-18 09:22:05

相關問題