试图找出为什么这两个 SOAP 请求之一不起作用 (java.lang.IllegalArgumentException)

2023-12-04

我有一个正在运行的 JAX-WS Web 服务,它已经有一些工作端点。现在我遇到以下问题:

我这里有两个不同的 SOAP 请求,我不明白为什么第一个请求有效,但第二个请求无效。

请求中唯一明显的区别是第一个请求在<Envelope>标签,而第二个标签在调用方法时指定它<getMoldDataHistory>.

SOAP 请求 1 - 不工作(命名空间在方法调用时指定)

<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
>
    <s:Body
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    >
        <getMoldDataHistory
            xmlns="http://history.production.soap.webservices.product.company.at/">
            <machineId>92623-15853588</machineId>
            <start>0</start>
            <end>0</end>
        </getMoldDataHistory>
    </s:Body>
</s:Envelope>

SOAP 请求 2 - 工作(命名空间在<Envelope> tag)

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:his="http://history.production.soap.webservices.product.company.at/">

   <soapenv:Header/>

   <soapenv:Body>
      <his:getMoldDataHistory>
         <machineId>92623-15853588</machineId>
         <start>0</start>
         <end>0</end>
      </his:getMoldDataHistory>
   </soapenv:Body>
</soapenv:Envelope>

我在发出第一个(无效)请求时收到的 SOAP 错误消息。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>java.lang.IllegalArgumentException</faultstring>
      </S:Fault>
   </S:Body>
</S:Envelope>

接收第一个 SOAP 请求时从服务器抛出的异常的堆栈跟踪。

java.lang.IllegalArgumentException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.Trampoline.invoke(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.xml.internal.ws.api.server.MethodUtil.invoke(Unknown Source)
    at com.sun.xml.internal.ws.api.server.InstanceResolver$1.invoke(Unknown Source)
    at com.sun.xml.internal.ws.server.InvokerTube$2.invoke(Unknown Source)
    at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.invoke(Unknown Source)
    at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.processRequest(Unknown Source)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Unknown Source)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Unknown Source)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Unknown Source)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Unknown Source)
    at com.sun.xml.internal.ws.server.WSEndpointImpl$2.process(Unknown Source)
    at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(Unknown Source)
    at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(Unknown Source)
    at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(Unknown Source)
    at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(Unknown Source)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
    at sun.net.httpserver.AuthFilter.doFilter(Unknown Source)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
    at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

所以我基本上试图找出为什么第一个请求不起作用,尽管它是一个有效的 SOAP 请求。我的服务器需要配置什么才能允许此类请求吗?

EDIT:

经过更多测试后,我发现如果我调用的方法有 0 个参数,则命名空间声明的位置并不重要。一旦需要参数,它就会停止工作。

EDIT 2:

现在我偶然发现这个线程在这里。我有同样的问题。我发出请求的 C# 客户端不使用方法标记中的命名空间。我添加后它就可以工作了。

我仍然如何告诉 JAX-WS 来处理这个问题。

不起作用:

<getMoldDataHistory xmlns="http://history.production.soap.webservices.product.company.at/">

Works:

<his:getMoldDataHistory xmlns:his="http://history.production.soap.webservices.product.company.at/">

当使用绑定到命名空间的前缀时,如

<his:getMoldDataHistory xmlns:his="http://history.production.soap.webservices.product.company.at/">
    <machineId>92623-15853588</machineId>
    <start>0</start>
    <end>0</end>
</his:getMoldDataHistory>

那么只有元素getMoldDataHistory被放入指定的命名空间中。原因是语法xmlns:his="..."仅声明前缀。那么这必须用于所有元素您希望位于指定的命名空间中。在此代码片段中,唯一的元素是getMoldDataHistory.

使用xmlns="..."语法类似于

<getMoldDataHistory xmlns="http://history.production.soap.webservices.product.company.at/">
    <machineId>92623-15853588</machineId>
    <start>0</start>
    <end>0</end>
</getMoldDataHistory>

不仅声明了命名空间,还放置了关联的元素和所有子元素进入这个命名空间。

结论:这两个 XML 片段在语义上并不等效。

如果存在“扩展元素名称”语法,那么这些 XML 片段将看起来像......

第一:

<{http://history.production.soap.webservices.product.company.at/}getMoldDataHistory>
    <{}machineId>92623-15853588</{}machineId>
    <{}start>0</{}start>
    <{}end>0</{}end>
</{http://history.production.soap.webservices.product.company.at/}getMoldDataHistory>

第二个:

<{http://history.production.soap.webservices.product.company.at/}getMoldDataHistory>
    <{http://history.production.soap.webservices.product.company.at/}machineId>92623-15853588</{http://history.production.soap.webservices.product.company.at/}machineId>
    <{http://history.production.soap.webservices.product.company.at/}start>0</{http://history.production.soap.webservices.product.company.at/}start>
    <{http://history.production.soap.webservices.product.company.at/}end>0<{/http://history.production.soap.webservices.product.company.at/}end>
</{http://history.production.soap.webservices.product.company.at/}getMoldDataHistory>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

试图找出为什么这两个 SOAP 请求之一不起作用 (java.lang.IllegalArgumentException) 的相关文章

随机推荐