【问题标题】:How @WebResult annotation works in JAX-WS@WebResult 注释在 JAX-WS 中的工作原理
【发布时间】:2018-10-28 13:53:36
【问题描述】:

我正在尝试创建 Jax-ws WebServices。但坚持使用 JAX-WS 2.2 的这种行为。

我是这样写SEI类的

  @WebService
@SOAPBinding(parameterStyle=ParameterStyle.WRAPPED,use=Use.LITERAL,style=Style.DOCUMENT)
        public class WebServicesServlet{
        @WebMethod
        public GetServerTimeProperty getServerTimeProperties(){
        return new GetServerTimeProperty();
        }

    }

为上述SEI生成的wsdl如下:

 <types>
    <xsd:schema>
    <xsd:import namespace="http://soapCl.test/" schemaLocation="WebServicesService_schema1.xsd"/>
    </xsd:schema>
    </types>
    <message name="getServerTimeProperties">
    <part name="parameters" element="tns:getServerTimeProperties"> </part>
    </message>
    <message name="getServerTimePropertiesResponse">
    <part name="parameters" element="tns:getServerTimePropertiesResponse"> </part>
    </message>

还有 XSD

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://soapCl.test/" version="1.0" targetNamespace="http://soapCl.test/">

<xs:element name="getTimeProperties" type="tns:getServerTimeProperties"/>
<xs:element name="getTimePropertiesResponse" type="tns:getServerTimePropertiesResponse"/>

<xs:complexType name="getServerTimeProperties">
<xs:sequence/>
</xs:complexType>
**<xs:complexType name="getServerTimePropertiesResponse">**
<xs:sequence>
**<xs:element name="return" type="tns:getServerTimeProperty" minOccurs="0"/>**
</xs:sequence>
</xs:complexType>


<xs:complexType name="getServerTimeProperty">
<xs:sequence>
<xs:element name="dayLightSavingHours" type="xs:int"/>
<xs:element name="observesDayLightSavings" type="xs:boolean"/>
<xs:element name="timeZoneDisplayName" type="xs:string"/>
<xs:element name="timeZoneId" type="xs:string"/>
<xs:element name="timeZoneValue" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

SOAP 响应:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <dlwmin:getServerTimePropertiesResponse xmlns:dlwmin="http://soapCl.test/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <GetServerTimeProperty>
            <dayLightSavingHours>0</dayLightSavingHours>
            <observesDayLightSavings>false</observesDayLightSavings>
         </GetServerTimeProperty>
      </dlwmin:getServerTimePropertiesResponse>
   </soapenv:Body>
</soapenv:Envelope>

我尝试使用 wsimport 生成存根,这是我可以在生成的端口类中观察到的内容

@WebMethod
    **@WebResult(targetNamespace = "")**
    @RequestWrapper(localName = "getServerTimeProperties", targetNamespace = "http://soapCl.test/", className = "soapCl.test.GetServerTimeProperties")
    @ResponseWrapper(localName = "getServerTimePropertiesResponse", targetNamespace = "http://soapCl.test/", className = "soapCl.test.GetServerTimePropertiesResponse")
    @Action(input = "http://soapCl.test/WsSessionEJBEndPoint/getServerTimePropertiesRequest", output = "http://soapCl.test/WsSessionEJBEndPoint/getServerTimePropertiesResponse")
    public GetServerTimeProperty getServerTimeProperties();

我很想知道为什么 WebResult 名称在 wsdl 中不同为“return”,在 soap Response 中为“GetServerTimeProperty”,在生成的存根中为“”。

此外,如果我不使用 @WebResult(name="GetServerTimeProperty") 注释 Web 方法,我的存根生成的客户端响应为空。

如果我用@WebResult(name="GetServerTimeProperty") 注释我的网络方法,我的soapResponse 如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns2:getServerTimePropertiesResponse xmlns:ns2="http://soapCl.test/">
         <return>
            <dayLightSavingHours>0</dayLightSavingHours>
            <observesDayLightSavings>false</observesDayLightSavings>
         </return>
      </ns2:getServerTimePropertiesResponse>
   </soapenv:Body>
</soapenv:Envelope>

@WebResult(name) 在 jax-ws 中是强制性的吗?我很想知道这个 webresult 注释是如何在肥皂响应和客户端响应中产生影响的。

每个“operationName”+“Respone”元素的名称是否应该是唯一的?我的 wsdl 有许多同名的元素

请就此提出建议,如果我们不注释,为什么 WebResult 名称返回soap响应为空

【问题讨论】:

  • 方法确实需要具有不同的名称,例如,如果您有两个具有相同名称但它们接受不同参数的方法,则应用服务器会抱怨,因此您可以修改 @WebResult 以减轻问题。
  • @JGlass,感谢您的输入。当我从 webservices.xml 中删除 并让 appserver 生成自己的 wsdl 时,我可以看到客户端存根没有 WebResult 名称。在这里,我的客户响应不为空。虽然我的wsdl没有改变。你认为 标签和 webResult name 有关系吗
  • 对不起,我还没有处理过 IBM web sphere,但是恕我直言,我不会依赖 webservice.xml,因为它是特定于应用程序服务器的,如果你需要移植你的代码/项目哟 JBoss 或 GlassFish,您将引入额外的移植问题
  • 所有可以帮助您的是“@WebResult 注释自定义返回值到 WSDL 部分或 XML 元素的映射。将此注释应用于客户端或服务器服务端点接口上的方法( SEI)或服务器端点实现类。”来自JAX-WS Annotations

标签: web-services jax-ws jax-ws-customization


【解决方案1】:

我进一步排除了这个

1.当两个webmethods方法具有相同的@WebResult(name="A")时,当我提到时,两个方法的soapResponse结果名称不同

<wsdl-file>web-inf/wsdl/WebService.wsdl</wsdl-file>

明确在 webservices.xml 中。

2.当我删除 webservices.xml 中的 &lt;wsdl-file&gt; 条目时,SoapResponse 返回名称相同。不确定 wsdl-file 标签是如何产生影响的。

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多