IT源码网

java之JAX-WS 在显式添加 SOAPAction header 后发送空值

third_qq_4accc0ab0fa5b582 2024年10月25日 程序员 44 0

我已经使用 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 
    } 
} 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!