ArcGIS GeoEvent处理器-javax.xml.ws.soap.SOAPFaultException:解组错误 背景

ArcGIS GeoEvent处理器-javax.xml.ws.soap.SOAPFaultException:解组错误 背景,java,jaxb,arcgis,Java,Jaxb,Arcgis,我正在使用wsimport创建一个Java webservice客户端,连接到返回数据集的.Net webservice(不幸的是)。更具体地说,我正在为ESRI ArcGIS Server 10.2的GeoEvent Processor套件进行一个项目(入站传输),但我认为这可能是关于JAXB和WSDL绑定的更一般的问题。请容忍我,因为我从大学开始就没有接触过Java(10年以上) 就WSDL而言,.Net数据集是一种多态类型,其实际布局在数据集填充数据后的运行时才确定。当您想将该Web服务与

我正在使用wsimport创建一个Java webservice客户端,连接到返回数据集的.Net webservice(不幸的是)。更具体地说,我正在为ESRI ArcGIS Server 10.2的GeoEvent Processor套件进行一个项目(入站传输),但我认为这可能是关于JAXB和WSDL绑定的更一般的问题。请容忍我,因为我从大学开始就没有接触过Java(10年以上)

就WSDL而言,.Net数据集是一种多态类型,其实际布局在数据集填充数据后的运行时才确定。当您想将该Web服务与.Net以外的任何东西一起使用时,这会导致问题

经过一些研究,我已经设法使用wsimport从webservice wsdl生成。然后,我能够编写一个基本的概念验证程序,该程序从作为DOM的Web服务中获取结果,然后作为节点列表遍历该DOM

参考:

  • 中关于工具箱绑定和图6的部分
我的wsimport如下所示(已更改域名以保护无辜者):


问题 不幸的是,当我在ArcGIS GeoEvent处理器中实现时,在我的概念验证中工作的同一个代码库(从webservice获得结果)失败了。我的项目是ArcGIS GeoEvent处理器将控制的OSGI包的一部分。下面的错误如GeoEvent处理器的Apache Karaf日志所示

基于这个错误,我的理解是,在wsimport中如何进行绑定存在问题,根据上面列出的链接引用通用模式。看起来泛型模式缺少某些元素的定义,这些元素作为wsimport生成的类存在。当我检查wsimport的输出时,这些类似乎是正确生成的

由于发布限制,我没有包含WSDL,但如果需要,我将在以后的响应中包含

我想弄清楚的是
  • 如何解释这个错误
  • 为什么在ArcGIS GeoEvent处理器中运行用于访问我的基本概念验证中的Web服务的相同wsimport生成的代码会失败
  • 这个错误提到了JAXB和SAX,我没有在概念验证或ArcGIS GeoEvent处理器项目中有意识地引用这些库。是否Web服务的绑定/解组处理方式有所不同,ArcGIS GeoEvent处理器封装在JAXB/SAX中,而概念验证则没有
  • 我能做些什么来解决这个问题?
  • 是否使用不同的定制xsd和xjb来详细说明Web服务的预期模式?我不确定到底该怎么做
  • 是否使用wsimport以外的工具来生成webservice引用类
  • 在java环境中为ArcGIS GeoEvent处理器调整一些东西
  • 其他选择
  • 去seppuku,那不是我的问题

错误
2014-09-23 16:10:14365 |错误| ansport侦听器| SomeInboundTransport | 367-com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport-1.0.0 |无法调用Webservice
javax.xml.ws.soap.SOAPFaultException:解组错误:意外元素(uri:)http://www.w3.org/2001/XMLSchema,local:“元素”)。预期的元素为,,,,,,,,,,
在org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)[120:org.apache.cxf.cxf rt frontend jaxws:2.6.1]
在com.sun.proxy.$Proxy198.getcompanyacgidata(未知源)[367:com.somecompany.arcgis.geoevent.transport.inbound.somecompanyboundtransport:1.0.0]
在com.somecompany.arcgis.geoevent.transport.inbound.SomeInboundTransport.callWebService(SomeInboundTransport.java:184)[367:com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport:1.0.0]
在com.somecompany.arcgis.geoevent.transport.inbound.SomeInboundTransport.run(SomeInboundTransport.java:257)[367:com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport:1.0.0]
在java.lang.Thread.run(Thread.java:722)[:1.7.0_17]
原因:javax.xml.bind.UnmarshalException
-除此之外:
[com.sun.istack.SAXParseException2;行号:1;列号:651;意外元素(uri:http://www.w3.org/2001/XMLSchema,本地:“元素”)。预期的元素为,,,,,,,,,,]
位于com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425)
位于com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362)
位于com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339)
位于org.apache.cxf.jaxb.jaxbencoder.doUnmarshal(jaxbencoder.java:784)[91:org.apache.cxf.cxf rt-databinding-jaxb:2.6.1]
在org.apache.cxf.jaxb.jaxbencoder.access$100(jaxbencoder.java:97)[91:org.apache.cxf.cxf rt-databinding-jaxb:2.6.1]
位于org.apache.cxf.jaxb.jaxbencoder$1.run(jaxbencoder.java:812)
位于java.security.AccessController.doPrivileged(本机方法)[:1.7.0_17]
位于org.apache.cxf.jaxb.jaxbencoder.unmarshall(jaxbencoder.java:810)[91:org.apache.cxf.cxf rt-databinding-jaxb:2.6.1]
在org.apache.cxf.jaxb.jaxbencoder.unmarshall(jaxbencoder.java:644)[91:org.apache.cxf.cxf rt-databinding-jaxb:2.6.1]
位于org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157)[91:org.apache.cxf.cxf rt数据绑定jaxb:2.6.1]
位于org.apache.cxf.interceptor.docliteralinterceptor.handleMessage(docliteralinterceptor.java:108)[87:org.apache.cxf.cxfapi:2.6.1]
位于org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)[87:org.apache.cxf.cxfapi:2.6.1]
在org.apache.c上
C:\Development\ArcGIS\WSDL>wsimport -b http://www.w3.org/2001/XMLSchema.xsd -b xsd.xjb -keep -p com.somecompany.services -XadditionalHeaders http://services.somecompany.com/DataRetrieval.asmx?wsdl
2014-09-23 16:10:14,365 | ERROR | ansport Listener | SomeInboundTransport             | 367 - com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport - 1.0.0 | Unable to call Webservice
javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"element"). Expected elements are <{http://services.somecompany.com/}complexType>,<{http://services.somecompany.com/}annotation>,<{http://services.somecompany.com/}redefine>,<{http://services.somecompany.com/}element>,<{http://services.somecompany.com/}include>,<{http://services.somecompany.com/}attributeGroup>,<{http://services.somecompany.com/}group>,<{http://services.somecompany.com/}notation>,<{http://services.somecompany.com/}import>,<{http://services.somecompany.com/}simpleType>,<{http://services.somecompany.com/}attribute> 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)[120:org.apache.cxf.cxf-rt-frontend-jaxws:2.6.1]
    at com.sun.proxy.$Proxy198.getCompanyArcgisData(Unknown Source)[367:com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport:1.0.0]
    at com.somecompany.arcgis.geoevent.transport.inbound.SomeInboundTransport.callWebService(SomeInboundTransport.java:184)[367:com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport:1.0.0]
    at com.somecompany.arcgis.geoevent.transport.inbound.SomeInboundTransport.run(SomeInboundTransport.java:257)[367:com.somecompany.arcgis.geoevent.transport.inbound.somecompanyInboundTransport:1.0.0]
    at java.lang.Thread.run(Thread.java:722)[:1.7.0_17]
Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 651; unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"element"). Expected elements are <{http://services.somecompany.com/}complexType>,<{http://services.somecompany.com/}annotation>,<{http://services.somecompany.com/}redefine>,<{http://services.somecompany.com/}element>,<{http://services.somecompany.com/}include>,<{http://services.somecompany.com/}attributeGroup>,<{http://services.somecompany.com/}group>,<{http://services.somecompany.com/}notation>,<{http://services.somecompany.com/}import>,<{http://services.somecompany.com/}simpleType>,<{http://services.somecompany.com/}attribute>]
    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:339)
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:784)[91:org.apache.cxf.cxf-rt-databinding-jaxb:2.6.1]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:97)[91:org.apache.cxf.cxf-rt-databinding-jaxb:2.6.1]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder$1.run(JAXBEncoderDecoder.java:812)
    at java.security.AccessController.doPrivileged(Native Method)[:1.7.0_17]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:810)[91:org.apache.cxf.cxf-rt-databinding-jaxb:2.6.1]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:644)[91:org.apache.cxf.cxf-rt-databinding-jaxb:2.6.1]
    at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157)[91:org.apache.cxf.cxf-rt-databinding-jaxb:2.6.1]
    at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:108)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1667)[118:org.apache.cxf.cxf-rt-transports-http:2.6.1]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1520)[118:org.apache.cxf.cxf-rt-transports-http:2.6.1]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1428)[118:org.apache.cxf.cxf-rt-transports-http:2.6.1]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:658)[118:org.apache.cxf.cxf-rt-transports-http:2.6.1]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:532)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320)[87:org.apache.cxf.cxf-api:2.6.1]
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89)[119:org.apache.cxf.cxf-rt-frontend-simple:2.6.1]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)[120:org.apache.cxf.cxf-rt-frontend-jaxws:2.6.1]
    ... 4 more
Caused by: com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 651; unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"element"). Expected elements are <{http://services.somecompany.com/}complexType>,<{http://services.somecompany.com/}annotation>,<{http://services.somecompany.com/}redefine>,<{http://services.somecompany.com/}element>,<{http://services.somecompany.com/}include>,<{http://services.somecompany.com/}attributeGroup>,<{http://services.somecompany.com/}group>,<{http://services.somecompany.com/}notation>,<{http://services.somecompany.com/}import>,<{http://services.somecompany.com/}simpleType>,<{http://services.somecompany.com/}attribute>
    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.Loader.childElement(Loader.java:101)
    at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:243)
    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)
    ... 28 more
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"element"). Expected elements are <{http://services.somecompany.com/}complexType>,<{http://services.somecompany.com/}annotation>,<{http://services.somecompany.com/}redefine>,<{http://services.somecompany.com/}element>,<{http://services.somecompany.com/}include>,<{http://services.somecompany.com/}attributeGroup>,<{http://services.somecompany.com/}group>,<{http://services.somecompany.com/}notation>,<{http://services.somecompany.com/}import>,<{http://services.somecompany.com/}simpleType>,<{http://services.somecompany.com/}attribute>
    ... 39 more
import com.somecompany.services.*; //generated by wsimport
import javax.xml.ws.*;
//...

private com.somecompany.services.DataRetrieval myWS;
private com.somecompany.services.DataRetrievalSoap port;

private byte[] callWebService(String userName, String pwd, long dataTimeFrame)
{
    try
    {
        myWS = new com.somecompany.services.DataRetrieval();

        port = myWS.getDataRetrievalSoap();
        com.somecompany.services.AuthSoapHeader mySoapHeader = new com.somecompany.services.AuthSoapHeader();
        mySoapHeader.setUserName(userName);

        //Hash the password then set it for the SOAP header
        String pwdHash = hashMD5(pwd);
        mySoapHeader.setPassword(pwdHash);
        Holder holder = new Holder<AuthSoapHeader>(mySoapHeader);

        Date endTime = new Date();
        Date startTime = new Date(endTime.getTime() - dataTimeFrame);
        XMLGregorianCalendar gcEndTime = dateToGregorianTime(endTime);
        XMLGregorianCalendar gcStartTime = dateToGregorianTime(startTime);

        GetCompanyArcgisDataResponse.GetCompanyArcgisDataResult companyData = port.getCompanyArcgisData(gcStartTime, gcEndTime, holder);

        if( ((AuthSoapHeader)holder.value).getError() != null)
        {
            log.error("Authentication to web services failed!");
            //OSGI stop service
            this.stop();
            return null;
        }else
            log.info("Authentication to web services successful.");

        //Convert the results to a java object and then to a byte array to send to the adapter
        Object companyDataAny = companyData.getAny();
        byte[] companyDataBytes = objectToBytes(companyDataAny);
        return companyDataBytes;

    }
    catch(Exception ex)
    {
        log.error("Unable to call Webservice", ex);
        //OSGI stop service
        this.stop();
        return null;
    }
}