有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ArcGIS GeoEvent处理器javax。xml。ws。肥皂SOAPFaultException:解组错误

背景

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

出于WSDL的目的。Net数据集是一种多态类型,其实际布局在数据集充满数据后的运行时才确定。当您想将该Web服务用于除此之外的任何内容时,这会导致问题。网

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

参考:

我的wsimport如下所示(域名已被更改以保护无辜者):

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

问题

不幸的是,当我在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中,而概念验证没有
  • 我能做些什么来解决这个问题?
    1. Use a different, custom, xsd and xjb that spells out the expected schema for the webservice? I'm not sure exactly how that would be done.
    2. Use something other than wsimport to generate the webservice reference classes?
    3. Tweak something in the java environment for the ArcGIS GeoEvent Processor?
    4. Other options?
    5. Commit seppuku, then it's not my problem?

错误

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;
    }
}

环境细节

  • JDK 7u17(1.7.0_17)64位。ArcGIS GeoEvent处理器正在使用这个版本的JRE,所以我被锁定在这个版本中执行。虽然在我意识到这一点之前,我在1.7.051中做了一些开发
  • wsimport-JAX-WSRI 2.2.4-b01
  • ArcGIS服务器10.2
  • ArcGIS GeoEvent处理器扩展
  • Karaf(由ArcGIS Geovent处理器用于运行OSGI捆绑包)

共 (1) 个答案

  1. # 1 楼答案

    这可能不是最好的答案,但我就是这么想的

    包装我的OSGI项目的ArcGIS GeoEvent处理器似乎正在对我在应用程序中引用的web服务进行一些额外的绑定/解除绑定。我为实现这一目标所做的工作。Net(DataSet return values)web服务在Java中运行,但GeoEvent处理器的包装器不接受它

    我的解决方案

    最终,我做的是创建一个二级。Net web服务,它获取数据集值并将其转换为JSON,然后返回JSON字符串。这消除了试图从web服务引用数据集返回值时遇到的问题,现在我正在处理一个简单的JSON字符串。JSON web服务的wsimport进行得很顺利,无需任何变通。我把新导入的web服务文件塞进java项目中,现在没有问题了

    关于C#DataSet到JSON的参考:

    • 使用Newtonsoft。Json(http://james.newtonking.com/json)。在使用了其他几个JSON序列化库之后,我发现这对我来说最有效
    • 纽顿软件。Json可通过NuGet软件包获得
    • 里克·斯特拉尔的网站帮了大忙