将soap头身份验证添加到wsdl2java生成的代码中

Dir*_*ulp 5 java soap wsdl2java soapheader usernametoken

我正在从wsdl创建Java Web服务客户端.我使用Eclipses的Dynamic Web Project和新的Web Services Client来生成带有Apache Axis 1.4的wsdl2java的代码.我需要为此代码添加SOAP身份验证,以便它与服务一起使用.我在生成的代码中找不到这样做的地方.经过大量的研究,我发现了这个,到目前为止,我已经将其用作我的代码的主干.

将ws-security添加到wsdl2java生成的类中

在我收到"处理邮件安全性时发生错误"之前或其他方面.现在我来了

"例外:不明白"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是问题吗?(我知道他们已经过时但仍然......)

Dir*_*ulp 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);
Run Code Online (Sandbox Code Playgroud)

哇,好多了。不要使用 Axis 1.4 的经验教训。