来自JAVA中SOAP生成的客户端的InaccessibleWSDLException错误

时间:2017-03-21 09:36:35

标签: java soap wsdl soap-client spring-ws

我们正在与服务提供商的wsdl合作,由于安全原因这是不可发现的,它们为我们提供了一堆文件,包括wsdl,xsd等。我们需要访问提供商的api。出于这些原因,我们做了以下这些事情:

  1. 我们使用netbean 8.0格式生成了一个Web服务客户端桌面位置(本地文件)
  2. 使用生成的客户端代码,我们使用以下代码
  3. 调用了api
    URL url = new URL("http://serverip:port/payment/services/MgrService");    
    MgrService svc = new MgrService(url);          
    Response response = svc.getMgrServicePort().apiRequest(request);
    

    但是获得了这些异常

    com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.
    
    java.io.IOException: Server returned HTTP response code: 500 for URL: http://serviceip:port/payment/services/MgrService
    java.io.IOException: Server returned HTTP response code: 500 for URL: http://serviceip:port/payment/services/MgrService?wsdl
    
        at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:260)
        at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:231)
        at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:194)
        at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:163)
        at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:348)
        at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:306)
        at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:215)
        at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:196)
        at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:192)
        at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:104)
        at javax.xml.ws.Service.<init>(Service.java:77)
    

    通过Wireshark,我们注意到它调用了一个没有肥皂体的 get方法,它只能调用 post方法。我们使用soapUI测试了api,服务还可以。我们也使用原始xml soap请求获得成功响应。

    当WSDL不可发现时, JAX-WS和Spring WS 是否可以使用生成的客户端?或者它只适用于 JAX-WS 的wsdl文件。 如果是这样,那么我们需要编辑wsdl吗?或其他一些方法

1 个答案:

答案 0 :(得分:2)

经过一番研究,我发现了这些!

1)对于Spring WS,生成的客户端不起作用(与Netbean Generated SOAP client一样)

2)这个链接帮助我使用 Spring STS 来使用Spring-WS服务 Consuming a SOAP web service

但在继续之前很少需要做的事情

a)将maven-jaxb2-plugin版本修复为较低版本(0.12.1)

b)添加一个binding.xjb文件,其中包含

<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings>
        <jxb:globalBindings>
            <xjc:simple/>
        </jxb:globalBindings>
    </jxb:bindings>
</jxb:bindings>

其他明智的xjc将无法正常工作

3)复制wsdl&amp; xsd文件到本地项目目录和pom配置会 如下(对于出于安全原因未托管wsdl的情况)

<configuration>
                    <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
                    <schemaIncludes>
                        <include>*.wsdl</include>
                    </schemaIncludes>
                </configuration>

3)不建议编辑wsdl文件