我正在从wsdl创建Java Web服务客户端。我使用Eclipses的Dynamic Web Project和新的Web Services Client来生成带有Apache Axis 1.4的wsdl2java的代码。我需要为此代码添加SOAP身份验证,以便它与服务一起使用。我在生成的代码中找不到这样做的地方。经过大量的研究,我发现了这个,到目前为止,我已经将其用作我的代码的主干。
Adding ws-security to wsdl2java generated classes
在我收到“处理邮件安全性时出错”或其他内容之前。现在我正在
“例外:未理解”MustUnderstand“标题:{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}安全消息:null”
我尝试了很多事情来克服这个异常。这是我现在的代码。
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)
此代码位于我的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>
有谁知道我还能在这做什么?为什么会发生这种异常?我尝试了很多不同的前缀和setProcesses以及setMustUnderstand值的组合(并且基于我对此异常的研究)。
如果有人知道在wsdl2java代码中添加Soap头认证的方法,我也会采取这种方式。只需要这个工作,你会认为这样的事情会更简单一点,或者至少有更多的例子。
更新 - 确认使用SOAPUI传递的相同头文件正常工作。必须是框架的东西?我创建了一个自定义处理程序来处理SOAP消息,但这没有帮助。 Axis 1.4和JAX-RPC是问题吗? (我知道他们已经过时但仍然......)
答案 0 :(得分:4)
冷却。我决定只使用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);
哇,那好多了。不要使用Axis 1.4课程。