向wsdl2java生成的代码添加soap头身份验证

向wsdl2java生成的代码添加soap头身份验证,java,soap,wsdl2java,soapheader,usernametoken,Java,Soap,Wsdl2java,Soapheader,Usernametoken,我正在从wsdl创建JavaWeb服务客户机。我使用Eclipses的动态Web项目和新的Web服务客户机来生成带有ApacheAxis1.4的wsdl2java代码。我需要将SOAP身份验证添加到此代码中,以便它与服务一起工作。我在生成的代码中找不到这样做的位置。经过大量的研究,我发现了这个,到目前为止我一直用它作为我代码的主干 在我收到“处理消息安全性时出错”或类似的消息之前。现在我越来越紧张了 异常:不理解“MustUnderstand”头:{}安全消息:null 我尝试了很多方法来克服

我正在从wsdl创建JavaWeb服务客户机。我使用Eclipses的动态Web项目和新的Web服务客户机来生成带有ApacheAxis1.4的wsdl2java代码。我需要将SOAP身份验证添加到此代码中,以便它与服务一起工作。我在生成的代码中找不到这样做的位置。经过大量的研究,我发现了这个,到目前为止我一直用它作为我代码的主干

在我收到“处理消息安全性时出错”或类似的消息之前。现在我越来越紧张了

异常:不理解“MustUnderstand”头:{}安全消息: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值都是徒劳的(基于我对这个异常的研究)

如果有人知道将Soap头身份验证添加到wsdl2java代码中的方法,我也会这么做。只需要这样做就行了,你会认为这样的事情会更简单一些,或者至少有更多的例子

更新-
确认使用SOAPUI传递的相同头工作正常。一定是框架的问题?我创建了一个自定义处理程序来处理SOAP消息,但这没有帮助。Axis1.4和JAX-RPC是问题所在吗?(我知道它们已经过时了,但仍然…

很酷。我决定只使用ApacheCXF作为我的框架,使用它就像添加

javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider) port;
    bp.getRequestContext().put("ws-security.username", username);
    bp.getRequestContext().put("ws-security.password", password);
哇,好多了。不要使用轴1.4的经验教训