Как работает аннотация @WebResult в JAX-WS
Я пытаюсь создать 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();
}
}
Сгенерированный wsdl для вышеуказанного SEI выглядит следующим образом:
<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" и в мыльном Response как "GetServerTimeProperty" и в сгенерированной заглушке как "".
Кроме того, если я не аннотирую Webmethod с помощью @WebResult(name="GetServerTimeProperty"), мой сгенерированный заглушкой ответ клиента будет нулевым.
Если я аннотирую свой веб-метод с помощью @WebResult(name="GetServerTimeProperty"), мой soap Response будет выглядеть следующим образом:
<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? Мне любопытно узнать, как эта аннотация веб-результата влияет на мыльный ответ и ответ клиента.
Разве это имя должно быть уникальным для каждого элемента "operationName"+"Respone"? Мой WSDL имеет много элементов с таким же именем, как
Пожалуйста, подскажите, почему имя WebResult возвращает мыльный ответ как ноль, если мы не комментируем
1 ответ
Далее я исключил это
1. Когда два метода webmethods имеют одинаковый @WebResult(name="A"), имя результата soapResponse отличается для двух методов, когда я упоминаю
<wsdl-file>web-inf/wsdl/WebService.wsdl</wsdl-file>
явно в webservices.xml.
2. Возвращаемое имя SoapResponse остается тем же, когда я удаляю <wsdl-file>
запись в webservices.xml. Не уверен, как тег wsdl-файла имеет значение.