У меня есть wsdl, определяющий кучу операций. Один из которых определяется следующим образом:
<wsdl:operation name="obtenirCommunication">
<wsdl:documentation/>
<soap:operation soapAction="obtenirCommunication"
style="document"/>
<wsdl:input>
<soap:body parts="requete" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="reponse" use="literal"/>
</wsdl:output>
<wsdl:fault name="fault">
<soap:fault name="fault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
Как видите, я специально определяю параметр soapAction как obtenirCommunication
.
Когда я создаю свое Java-приложение с Maven, интерфейс создается на основе wsdl с использованием CXF.
<jaxws:client id="servicesFondationProxy" serviceName="srv:DesjServiceDivulgation"
serviceClass="com.desjardins.finances.divulgation.divulgations.services.fondation.service.http.DesjServiceDivulgation"
address="${com/desjardins/finances/divulgation/divulgations/Services_fondation_endpoint}">
<jaxws:outInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="[...]" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackRef" value-ref="sfPasswordCallback" />
</map>
</constructor-arg>
</bean>
<bean
class="com.desjardins.finances.divulgation.divulgations.accesServicesFondation.CustomFieldInjectHandler"
scope="singleton">
</bean>
</jaxws:outInterceptors>
<jaxws:features>
<wsa:addressing xmlns:wsa="http://cxf.apache.org/ws/addressing" />
</jaxws:features>
</jaxws:client>
Когда я захожу в этот интерфейс, я вижу, что операция установлена правильно.
@WebResult(name = "ObtenirCommunicationReponse", targetNamespace = "[...]", partName = "requete")
@WebMethod(action = "obtenirCommunication")
public ObtenirCommunicationReponseType obtenirCommunication(
@WebParam(partName = "requete", name = "ObtenirCommunicationRequete", targetNamespace = "[...]")
ObtenirCommunicationRequeteType requete
) throws Fault;
Я вижу операцию, которую я определил, параметр действия установлен правильно.
Теперь, когда я запускаю свой сервер и нажимаю на элемент IHM, который переключает вызов службы, вот действие в отправляемом сообщении SOAP:
<Action xmlns="http://www.w3.org/2005/08/addressing">obtenirListeCommunication</Action>
Я не могу понять, почему действие, которое я определил в моем wsdl, перезаписывается с помощью obtenirListeCommunication
. Я должен указать, что obtenirListeCommunication
- это действие, соответствующее предыдущему вызову, который я выполняю при прохождении IHM. Чтобы уточнить, сначала я вызываю службу (obtenirListeCommunication
), которая извлекает и отображает группу объектов Communication. Для каждого из этих объектов я могу позвонить во вторую службу (obtenirCommunication
), чтобы получить больше информации о конкретной связи.
Это похоже на то, что параметр action не обновляется после первого вызова службы.
Мой вопрос: что я сделал не так? Я забыл что-то настроить? Почему действие, указанное в моем wsdl, игнорируется / не обновляется?
Как SOAP генерирует такие заголовки?
Заранее спасибо за помощь.