2010-06-18 33 views
0

我寫了一些web服務,其中一些返回一個簡單的字符串(這些工作)和其他返回對象的列表。不,Axis2的(1.5.1)不能處理集合類型,所以我改變了我的返回類型Object[]但我仍然收到這個異常Axis2不返回自己的對象

[ERROR] java.lang.RuntimeException: org.apache.axis2.AxisFault: Mapping qname not fond for the package: de.ac.dto 
org.apache.axis2.AxisFault: java.lang.RuntimeException: org.apache.axis2.AxisFault: Mapping qname not fond for the package: de.ac.dto 
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) 
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:161) 
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40) 
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173) 
    at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:167) 
    at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: org.apache.axiom.om.OMException: java.lang.RuntimeException: org.apache.axis2.AxisFault: Mapping qname not fond for the package: de.ac.dto 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:260) 
    at org.apache.axiom.om.impl.llom.OMNodeImpl.build(OMNodeImpl.java:335) 
    at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:737) 
    at org.apache.axiom.om.impl.llom.OMElementImpl.detach(OMElementImpl.java:706) 
    at org.apache.axiom.om.impl.llom.OMNodeImpl.setParent(OMNodeImpl.java:124) 
    at org.apache.axiom.om.impl.llom.OMElementImpl.addChild(OMElementImpl.java:297) 
    at org.apache.axiom.om.impl.llom.OMElementImpl.addChild(OMElementImpl.java:213) 
    at org.apache.axiom.soap.impl.llom.SOAPBodyImpl.addChild(SOAPBodyImpl.java:231) 
    at org.apache.axis2.rpc.receivers.RPCUtil.processResponseAsDocLitWrapped(RPCUtil.java:381) 
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:138) 
    ... 19 more 
Caused by: java.lang.RuntimeException: org.apache.axis2.AxisFault: Mapping qname not fond for the package: de.ac.dto 
    at org.apache.axis2.databinding.utils.BeanUtil.getPropertyQnameList(BeanUtil.java:261) 
    at org.apache.axis2.databinding.utils.BeanUtil.getPullParser(BeanUtil.java:67) 
    at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:998) 
    at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:835) 
    at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71) 
    at javax.xml.stream.util.StreamReaderDelegate.next(StreamReaderDelegate.java:60) 
    at org.apache.axiom.om.impl.builder.SafeXMLStreamReader.next(SafeXMLStreamReader.java:183) 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:597) 
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:172) 
    ... 28 more 
Caused by: org.apache.axis2.AxisFault: Mapping qname not fond for the package: de.ac.dto 
    at org.apache.axis2.databinding.utils.BeanUtil.getPropertyQnameList(BeanUtil.java:117) 
    ... 36 more 

由Eclipse提供的嚮導創建的服務。 axis2是否無法返回這些對象?只返回原始類型不符合我的需要。

回答

2

軸無法找到它需要能夠轉換您通過XML發送的對象的映射。它不知道如何將XML轉換爲對象,或者相反。一個好主意是返回一個包含對象數組的對象。

使用Axis,您必須告訴它如何執行XML與對象之間的映射。這是使用WSDL和Classes本身定義的。

1)查看由Web服務生成的WSDL:您可以通過查看http://localhost:8080/Service?wsdl找到它。檢查這是OK。

2)Axis通過查看Class.getTypeDesc()的返回值來找到它的映射。檢查這個映射是否正確。

對於我的服務之一,我定義了以下映射作爲Web服務的返回值(RechercherBatimentRetour類,Retour的子類)。

typeDesc.setXmlType(new QName("sbatimentto", "RechercherBatimentRetour")); // 1 
org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc(); 
elemField.setFieldName("batiments"); 
elemField.setXmlName(new QName("", "batiments")); // 2 
elemField.setXmlType(new QName("sbatimentto", "ResumeBatimentTo")); 
elemField.setNillable(true); 
typeDesc.addFieldDesc(elemField); 

這是定義此SOAP服務的返回值。

// 1 - >這就是說WSDL ComplexType RechercherBatimentRetour位於命名空間'sbatimentto'中。

// 2 - >我們添加字段「batiments」到的ComplexType,其經由吸氣劑和setter在類定義爲:

public ResumeBatimentTo[] getBatiments() { 
    return batiments; 
} 

public void setBatiments(ResumeBatimentTo[] batiments) { 
    this.batiments = batiments; 
} 

的ResumeBatimentTo也是在相同的命名空間。因此,這結束了與含有WSDL(amoungst其他東西)

 
    <complexType name="Retour"> 
    <sequence> 
    <element name="codeRetour" nillable="true" type="xsd:string"/> 
    <element name="message" nillable="true" type="xsd:string"/> 
    <element name="statut" type="xsd:boolean"/> 
    </sequence> 
    </complexType> 

    <complexType name="RechercherBatimentRetour"> 
    <complexContent> 
    <extension base="tns1:Retour"> 
     <sequence> 
     <element name="batiments" nillable="true" type="impl:ArrayOf_tns1_ResumeBatimentTo"/> 
     </sequence> 
    </extension> 
    </complexContent> 
    </complexType> 

所有使用的類必須以能夠使用正確定義一個getTypeDesc,getSerializer & getDeserializer。

+0

好的答案,但我將我的服務從axis2更改爲彈簧支持的粗麻布服務,完全滿足我的需求。無論如何,我接受這篇文章,這對其他人可能有用。 – onigunn 2010-06-23 21:17:29

0

實際上,Web服務方法的返回類型應該是非泛型的。

它不應該是對象,或者只是一個清單...

因此,返回一個特定的Person類對象..如果Person類的一個對象需要返回 或者對象的名單是有.. ...使用...清單.....

確實改變....並享受.... !!!!!