在明确添加SOAPAction标头之后,JAX-WS发送空值

时间:2018-07-12 06:35:29

标签: java web-services http-headers jax-ws

我已经使用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。*软件包。

1 个答案:

答案 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
    }
}
相关问题