我在Eclipse和RAD 7.0中使用Apache CXF,IBM Jax-WS和Axis生成了存根。
在以上3个场景中,它给出了以下异常
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: ARERR [149] A user name must be supplied in the control record
搜索后我得出结论,我必须将身份验证信息添加到客户端存根创建的Soap头中。
我在这个链接上尝试了答案
How do you add a Soap Header defined in a wsdl to a web service client in CXF?
但无法成功。我是SOAP和WebServices的新手
所以,如果有人对此有所帮助,请帮助。
答案 0 :(得分:1)
我几天前遇到过这个问题,这对我来说很头疼。生成存根时,必须将标志 -XadditionalHeaders 添加到wsimport命令。
"C:\Program Files\Java\jdk1.X.X_XX\bin\wsimport.exe" -p com.company.package -keep -XadditionalHeaders -d folder1 http://mywsdllocation.com/doc.wsdl
其中: -p:包含生成的类的包 -keep:保留.java文件(否则只会获取.class文件) -XadditionalHeaders:将创建用于身份验证的类 -d:将放置生成的类的文件夹。
之后,您只需将生成的java文件复制到您选择的包(在本例中为com.company.package)下的项目中。然后,您可以创建一个AuthenticationInfo对象并将其插入到stub方法的调用中,如下所示:
WSService service = new WSService();
WSPortTypePortType port = service.WSPortTypeSoap();
AuthenticationInfo auth = new AuthenticationInfo();
auth.setUserName(yourUsername);
auth.setPassword(yourPassword);
port.method(param1,param2,auth);
希望它有所帮助!