gpt4 book ai didi

java - SpringBoot客户端中使用WebServiceTemplate调用SOAP Web服务

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

我正在使用 WebServiceTemplate 调用 SOAP Web 服务。我能够使用 SOAP UI 通过以下输入调用该服务并获得正确的响应。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:abc="http://abc.hs.com/">
<soapenv:Header>
<version>1<version>
</soapenv:Header>
<soapenv:Body>
<abc:getUser>
<userId>pan</userId>
</abc:getUser>
</soapenv:Body>
</soapenv:Envelope>

但是当使用 WebserviceTemplate 调用时,如下所示:

public String getUser(String userId) {
List<String> detail = new ArrayList<String>();
try {
template = new WebServiceTemplate(marshaller);
String requestPayload = getXmlInput();// This is same xml I am sending using SOAPUI
StreamSource source = new StreamSource(new StringReader(requestPayload));
StreamResult result = new StreamResult(System.out);
template.sendSourceAndReceiveToResult("http://localhost:8080/HERSvc/InsService", source,
new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) throws IOException {
TransportContext context = TransportContextHolder.getTransportContext();
HttpUrlConnection connection = (HttpUrlConnection) context.getConnection();
connection.addRequestHeader("Content-Type", "text/xml; charset=utf-8");
connection.addRequestHeader("soapAction", "");
}
},result);
} catch (IOException e) {
e.printStackTrace();
}
return "";
}

我在服务器端收到以下错误:E org.apache.axis2.engine.AxisEngine receive 未找到操作的端点引用 (EPR) 是 http://localhost:8080/HERSvc/InsService 和WSA 行动 = .如果此 EPR 以前可以访问,请联系服务器管理员。

客户端错误消息:出现意外错误(类型=内部服务器错误,状态=500)。

经过https://stackoverflow.com/questions/5981379/the-endpoint-reference-epr-for-the-operation-not-found-is后,我添加了 Content-Type 和标题中的soapAction

注意:我怀疑问题出在我的 requestPayload 上,它的格式不正确。它与 SOAP UI 中使用的字符串相同。看起来输入被转换为 Body

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<soapenv:Envelope xmlns:abc="http://abc.hs.com/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<version>1<version>
</soapenv:Header>
<soapenv:Body>
<abc:getUser>
<userId>pan</userId>
</abc:getUser>
</soapenv:Body>
</soapenv:Envelope>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

最佳答案

问题是所需的 header 格式不正确。最初我无法创建objectPayload,因此无法使用marshalSendAndReceive。因此,为了创建正确的 objectPayload,我使用 wsdl 从命令提示符生成 ObjectFactory,然后将创建的所有对象导入到项目中。使用 marshalSendAndReceive 如下

wsimport -d generated http://example.org/stock?wsdl

public User getUser(User user) {
try {
template = new WebServiceTemplate(marshaller);
JAXBElement<?> response = (JAXBElement<?>)template.marshalSendAndReceive("http://localhost:8080/HERSvc/InsService",
new ObjectFactory().createGetUser(user),
new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
try {
SoapMessage soapMessage = (SoapMessage)message;
SoapHeader header = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<version>1.0</version>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, header.getResult());
} catch (Exception e) {
e.printStackTrace();
}
}
}) ;
} catch (IOException e) {
e.printStackTrace();
}
GetUserResponse responseObject = (GetUserResponse)response.getValue();
User user = responseObject.getReturn();
}

关于java - SpringBoot客户端中使用WebServiceTemplate调用SOAP Web服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57959802/

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