简体   繁体   English

如何在Apache Axis2 WebService中返回自定义对象

[英]How to return custom objects in Apache Axis2 WebService

I have been trying to deploy an Apache Axis2 WebService using Eclipse Juno, Maven and the java2wsdl plugin. 我一直在尝试使用Eclipse Juno,Maven和java2wsdl插件部署Apache Axis2 WebService。 However I keep running into a problem which I believe is due to mapping and hopefully someone can point me in the right direction. 然而,我一直遇到一个问题,我认为这是由于映射,希望有人可以指出我正确的方向。

I'm trying to call an operation on my WebService that takes in a parameter and returns a custom object but so far with no luck. 我正在尝试在我的WebService上调用一个接受参数并返回自定义对象的操作,但到目前为止没有运气。

My Code 我的守则

For talk sake I have the following class: 为了说话,我有以下课程:

package com.example.models;
public class MyClass {
    // Does something
}

And I return a list of MyClass in the following operation: 我在以下操作中返回MyClass列表:

package com.example.service;
import com.example.models;
public class MyService {
    public List<MyClass> getExampleData(// a parameter) {  
        // Do something
        return aListOfMyClass;
    }
}

My services.xml file: 我的services.xml文件:

<serviceGroup>
  <service name="MyWebService" targetNamespace="http://com.example.service.MyWebService/">
    <description>JNLPGenerator service</description>
    <schema schemaNamespace="http://com.example.service.MyWebService/" />
    <parameter name="ServiceClass" locked="false">com.example.service.MyWebService</parameter>
    <operation name="getExampleData">
      <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
  </service>
</serviceGroup>

The error: 错误:

When I deploy the WebService I get the following error message which is due to the class MyClass not being mapped. 当我部署WebService时,我收到以下错误消息,这是由于未映射类MyClass。

<Exception>org.apache.axis2.AxisFault: org.apache.axis2.AxisFault: Mapping qname not fond for the package: com.example.models
    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.util.RESTUtil.invokeAxisEngine(RESTUtil.java:135)
    at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:817)
    at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.RuntimeException: org.apache.axis2.AxisFault: Mapping qname not fond for the package: com.example.models
    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:994)
    at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:831)
    at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:672)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
    at org.apache.axiom.om.impl.llom.OMSerializableImpl.build(OMSerializableImpl.java:78)
    at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:745)
    at org.apache.axiom.om.impl.llom.OMElementImpl.detach(OMElementImpl.java:723)
    at org.apache.axiom.om.impl.llom.OMNodeImpl.setParent(OMNodeImpl.java:105)
    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:422)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:138)
    ... 25 more
Caused by: org.apache.axis2.AxisFault: Mapping qname not fond for the package: com.example.models
    at org.apache.axis2.databinding.utils.BeanUtil.getPropertyQnameList(BeanUtil.java:117)
    ... 40 more
</Exception>

So what I want to know is how to do this. 所以我想知道的是如何做到这一点。 I have read a similar post but to be honest I still don't really understand where I have to add this mapping to solve the problem. 我已经阅读了类似的帖子,但说实话,我仍然不明白我必须添加此映射来解决问题。 Also just to point the deploying of the web service is fine and the wsdl is also generated fine. 也只是指出Web服务的部署很好,wsdl也很好。

Sorry for a long post but hopefully someone can help me out.. 很抱歉很长的帖子,但希望有人可以帮助我..

The problem is due to Java2WSDL inability to work with Java Collections so the solution is not to use Java Collections when working Web Services and use Arrays instead. 问题是由于Java2WSDL无法使用Java Collections,因此解决方案是在使用Web Services并使用Arrays时不使用Java Collections。

Basically to get my web service working I made the following changes. 基本上为了使我的Web服务工作,我做了以下更改。

package com.example.service;
import com.example.models;
public class MyService {
    public MyClass[] getExampleData(// a parameter) {  
        // Do something
        return myClassArray;
    }
}

For anyone that wants more information about Java2WSDL inabilities with Java Collections, you can refer to Java web services: Axis2 Data Binding by IBM DeveloperWorks . 对于想要了解有关Java Collections的Java2WSDL inability的更多信息的任何人,您可以参考Java Web服务:IBM DeveloperWorks的Axis2数据绑定

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM