我已经使用 NetBeans 8.2 向导从现有 WSDL 文档制作了 Web 服务客户端。使用Java8和JAX-WS 2.2.9。
据我了解,向导创建的代码按预期工作,但查询缺少“SOAPAction” header 中的值,这是查询工作必须具有值的要求。 header 键存在,但值为空字符串:SOAPAction: ""
,而它应该是 SOAPAction = "SendReports"
我尝试过使用这个:
Map<String, List<String>> requestHeaders = new HashMap<>();
requestHeaders.put("SOAPAction", Arrays.asList("sendReports"));
sourceDispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
-> 这也会导致空值。如果我输入“SOAPAction_2”和“sendReports”,该 header 工作正常,但显然 header 键是错误的并且无法解决我的问题。之后有什么东西会覆盖我的值?
webservice方法有注释:
@WebMethod(operationName = "SendReports", action = "SendReports")
关于我接下来可以尝试什么的任何提示?
我看到很多帖子建议使用 BindingProvider,但我无法使用 com.sun.* 包,原因不明。
请您参考如下方法:
终于找到了可行的解决方案。
我使用 Netbeans 创建了一个 Web 服务 Dispatch 客户端(与最初一样),并且必须添加 SOAPACTION_USE_PROPERTY 和 SOAPACTION_URI_PROPERTY。 我之前曾尝试过将这些作为系统属性,但似乎不起作用。
这是工作片段:
public void sendReports() throws IOException {
ReportService service = new ReportService();
QName portQName = new QName("http://URL/ReportService", "ReportService");
req = readFile("C:/temp/myFile.xml", "UTF-8");;
try {
// Call Web Service Operation
Dispatch<Source> sourceDispatch = null;
sourceDispatch = service.createDispatch(portQName, Source.class, Service.Mode.PAYLOAD);
Map<String, Object> map = sourceDispatch.getRequestContext();
map.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
map.put(BindingProvider.SOAPACTION_URI_PROPERTY, "SendReports");
Source result = sourceDispatch.invoke(new StreamSource(new StringReader(req)));
} catch (Exception ex) {
// TODO handle custom exceptions here
}
}