我已经使用NetBeans 8.2向导从现有的WSDL文档中创建了Web服务客户端。使用了Java8和JAX-WS 2.2.9。
据我所知,一切都可以按预期使用向导创建的代码,但是查询缺少“ SOAPAction”标头中的值,该值必须具有查询工作的值。标头键已存在,但值为空字符串: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”,则该标头可以正确运行,但显然标头键是错误的,无法解决我的问题。之后有什么东西覆盖了我的价值?
webservice方法具有注释:
@WebMethod(operationName = "SendReports", action = "SendReports")
有关我接下来可以尝试什么的任何提示?
我看到许多建议使用BindingProvider的帖子,但由于无法解释的原因,我无法使用com.sun。*软件包。
答案 0 :(得分:0)
最后找到了可行的解决方案。
我使用Netbeans创建了一个Web服务调度客户端(与最初一样),并且不得不添加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
}
}