gpt4 book ai didi

java - WSDL 操作中的soapAction 属性为空

转载 作者:行者123 更新时间:2023-12-04 02:15:24 24 4
gpt4 key购买 nike

有一个具有以下 WSDL 的 Web 服务:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://fer2.klab/notify" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://fer2.klab/notify" targetNamespace="http://fer2.klab/notify">
<wsdl:types>
<xs:schema xmlns:er="http://fer2.klab/notify" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://fer2.klab/notify">
<xs:element name="ServiceRequest">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="HL7message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ServiceResponse">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="response" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="ServiceResponse">
<wsdl:part element="tns:ServiceResponse" name="ServiceResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="ServiceRequest">
<wsdl:part element="tns:ServiceRequest" name="ServiceRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="NotifyPort">
<wsdl:operation name="Service">
<wsdl:input message="tns:ServiceRequest" name="ServiceRequest">
</wsdl:input>
<wsdl:output message="tns:ServiceResponse" name="ServiceResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="NotifyPortSoap11" type="tns:NotifyPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Service">
<soap:operation soapAction=""/>
<wsdl:input name="ServiceRequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="ServiceResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="NotifyPortService">
<wsdl:port binding="tns:NotifyPortSoap11" name="NotifyPortSoap11">
<soap:address location="http://192.168.1.101:8080/fer2-0.0.1/ws"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

有一个端点:
@Endpoint
public class NotifyEndPoint {

private static final String NAMESPACE_URL = "http://fer2.klab/notify";

@Autowired
MainController mainController;

@PayloadRoot(namespace = NAMESPACE_URL, localPart = "ServiceRequest")
@ResponsePayload
public ServiceResponse send(@RequestPayload ServiceRequest hlMessage){
System.out.println("notify method");
Object resp = mainController.notify(null, "", hlMessage.getHL7Message());
ServiceResponse sr = new ServiceResponse();
if (resp != null){
sr.setResponse(resp.toString());
}
else{
sr.setResponse("null");
}

return sr;
}
}

调度程序servlet.xml:
<bean id="notify" name="notify" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<!--<property name="createSoap12Binding" value="true" />-->
<property name="portTypeName" value="NotifyPort" />
<property name="locationUri" value="/ws" />
<property name="schema">
<bean class="org.springframework.xml.xsd.SimpleXsdSchema">
<property name="xsd" value="notify.xsd" />
</bean>
</property>
<property name="targetNamespace" value="http://fer2.klab/notify" />
<!--<property name="soapActions">-->
<!--<props>-->
<!--<prop key="ServiceRequest">http://fer2.klab/notify/ServiceRequest"</prop>-->
<!--</props>-->
<!--</property>-->
</bean>

应用程序-config.xml:
<bean class="klab.backend.utils.MainConfig" id="mainConfig">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="locations">
<list>
<value>/WEB-INF/main.properties</value>
<value>/WEB-INF/build.properties</value>
</list>
</property>
</bean>

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="writeAcceptCharset" value="true"/>
</bean>
<bean class="klab.backend.utils.json.JacksonView2HttpMessageConverter">

<property name="objectMapper">
<bean class="klab.backend.utils.json.KJsonMapper">
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

<context:component-scan base-package="klab.fer2"/>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
<property name="validator" ref="validator"/>
</bean>

<bean class="klab.backend.controller.base.DefaultController"/>

<bean name="CorsFilter" class="klab.backend.filter.CorsFilter"/>

为什么 Service生成的 WSDL 中的操作具有空属性 soapAction ?

对 URL 的 SOAP 请求 http://192.168.1.101:8080/fer2-0.0.1/ws具有以下内容:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:not="http://fer2.klab/notify">
<soapenv:Header/>
<soapenv:Body>
<not:ServiceRequest>
<not:HL7message>hdfghdfghdfgh</not:HL7message>
</not:ServiceRequest>
</soapenv:Body>
</soapenv:Envelope>

结果记录了以下错误:
 org.springframework.ws.server.EndpointNotFound- No endpoint mapping found for [SaajSoapMessage {http://fer2.klab/notify}ServiceRequest]

最佳答案

soapAction soap:operation 的属性element 是将包含在 HTTP 请求消息中的值,如下所示:

POST /StockQuote HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "http://electrocommerce.org/abc#MyMessage"

specification 中所述此值仅指示将调用哪个操作的意图,并且在创建 stub 时 Web 服务框架通常不使用它。

一个常见的模式是将其设置为空字符串,如 <soap:operation soapAction=""这意味着请求所指的操作在 http 请求的有效负载中指明。所以你的 wsdl 在这方面看起来不错。

Spring但是,您可以使用 @SoapAction 注释方法并且该方法将使用soapAction header 进行映射。但是您正在使用 @PayloadRoot在您的方法上,因此它将使用本地名称“ServiceRequest”进行映射,因此soapAction 的值将为 ""它不会被使用。

关于java - WSDL 操作中的soapAction 属性为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com