Dir*_*ulp 5 java soap wsdl2java soapheader usernametoken
我正在从wsdl创建Java Web服务客户端.我使用Eclipses的Dynamic Web Project和新的Web Services Client来生成带有Apache Axis 1.4的wsdl2java的代码.我需要为此代码添加SOAP身份验证,以便它与服务一起使用.我在生成的代码中找不到这样做的地方.经过大量的研究,我发现了这个,到目前为止,我已经将其用作我的代码的主干.
在我收到"处理邮件安全性时发生错误"之前或其他方面.现在我来了
"例外:不明白"MustUnderstand"标题:{ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd }安全信息:空值"
我已经尝试了很多东西来克服这个异常.这是我现在到达的代码.
javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName);
header.setActor(null);
header.setMustUnderstand(true);
// Add the UsernameToken element to the WS-Security header
javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken");
utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1");
javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username");
userNameElem.setValue("username");
javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password");
passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordElem.setValue("password");
header.setProcessed(true);
// Finally, attach the header to the binding.
setHeader(header)
Run Code Online (Sandbox Code Playgroud)
此代码位于我的Binding_ServiceStub类中(在其"createCall方法"中).
我们使用这个wsdl在C#和VB中创建了客户端,并且只需更改ClientCredentials变量就可以轻松实现,该变量是生成的代理类的扩展.我希望这里有类似的东西.
这是wsdl代码中的安全策略.
<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy>
Run Code Online (Sandbox Code Playgroud)
有谁知道我还能在这做什么?为什么会发生这种异常?我已经尝试了很多不同的前缀和setProcesses以及setMustUnderstand值的组合都是徒劳的(并且基于我对此异常的研究).
如果有人知道在wsdl2java代码中添加Soap头认证的方法,我也会采取这种方式.只是需要这个工作,你会认为这样的事情会更直接或至少有更多的例子.
更新 - 确认使用SOAPUI传递的相同头文件正常工作.必须是框架的东西?我创建了一个自定义处理程序来处理SOAP消息,但这没有帮助.Axis 1.4和JAX-RPC是问题吗?(我知道他们已经过时但仍然......)
凉爽的。我决定只使用 Apache CXF 作为我的框架,使用它就像添加一样简单
javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider) port;
bp.getRequestContext().put("ws-security.username", username);
bp.getRequestContext().put("ws-security.password", password);
Run Code Online (Sandbox Code Playgroud)
哇,好多了。不要使用 Axis 1.4 的经验教训。