最近项目用到WebService 要求用Axis2实现,以前没用过Axis2,最近把网上的资料加上自己的琢磨写在这里,网上大多介绍了服务端Service简单的传递字符串 和数组对象,没具体介绍传递对象里封装嵌套简单对象和数组对象,类似如下对象:
public class BuissnessInfo { //返回状态业务码; private String code; //数组对象; private User[] user; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public User[] getUser() { return user; } public void setUser(User[] user) { this.user = user; } }
好了,废话少说 直接贴图 配置Axis2 Webservice:
第一步:写服务端servcie:
public class HelloImpl { public BuissnessInfo getList(Prameters p) throws AppAxis2 { System.out.println("p="+p.getCode()); System.out.println("p="+p.getCode2()); BuissnessInfo info = new BuissnessInfo(); User user = new User(); user.setId("1"); user.setName("张三"); User user1 = new User(); user1.setId("2"); user1.setName("李四"); User user2 = new User(); user2.setId("3"); user2.setName("王五"); User user3 = new User(); user3.setId("4"); user3.setName("小六"); User[] users = new User[]{user,user1,user2,user3}; info.setCode("00000000001"); info.setUser(users); return info; } }
public class User { private String id; private String name; private String errorCode; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
暴露服务接口方法:配置services.xml
<service name="Hello"> <parameter name="ServiceClass"> HelloImpl </parameter> <operation name="getList"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service>
好了服务端生成好了 直接访问:http://127.0.0.1:8090/HelloWorld/services/Hello?wsdl 看是否发布成功;
客户端代码实现如下:客户端也是用axis2实现的,axis2实现的客户端调用方式比较多,为了能满足对象里封装对象数组和简单对象 的需求,我采用了stub ,用wsdl2java方式生成,命令如下:
%AXIS2_HOME%\bin\wsdl2java -uri http://127.0.0.1:8090/HelloWorld/services/Hello?wsdl -p client -s -o stub
当然 wsdl2java 工具得上网上下,下载后 %AXIS2_HOME%类似于java_home 得配置下环境变量;
最后在 你的当前目录下会生成一个stub目录 里面有生成的客户端文件
客户端文件生成好后调用如下:
package client; import java.rmi.RemoteException; public class Client { public static void main(String args[]) throws RemoteException, AppAxis2Exception{ HelloStub stub = new HelloStub(); HelloStub.GetList gg = new HelloStub.GetList(); HelloStub.Prameters param = new HelloStub.Prameters(); param.setCode("test"); param.setCode2("hello "); gg.setP(param); //调用 HelloStub.BuissnessInfo info = stub.getList(gg).get_return(); //返回 String ss =info.getCode(); HelloStub.User[] strArray = info.getUser(); for (HelloStub.User s : strArray) System.out.println("id="+s.getId()+"name="+s.getName()); System.out.println(ss); } }
完成系统输出:
id=1name=张三 id=2name=李四 id=3name=王五 id=4name=小六 00000000001
当然 或许你还会说 为了安全考虑 Axis2生成了客户端代码,但是服务端要求用户名、密码验证,不知道客户端如何加入?(资料出处 axis2 客户端调用wss4j 安全web服务的方法 http://blog.csdn.net/bibitoo712/archive/2008/10/30/3184252.aspx)
其实很简单:直接上图了
package client; import java.rmi.RemoteException; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.soap.impl.dom.SOAPHeaderBlockImpl; import org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory; import org.apache.axiom.soap.impl.dom.soap11.SOAP11HeaderBlockImpl; public class AddHeaderClinet { public static void main(String args[]) throws RemoteException, AppAxis2Exception{ HelloStub stub = new HelloStub(); HelloStub.GetList gg = new HelloStub.GetList(); HelloStub.Prameters param = new HelloStub.Prameters(); param.setCode("test"); param.setCode2("hello "); gg.setP(param); SOAP11Factory factory = new SOAP11Factory(); OMNamespace SecurityElementNamespace = factory.createOMNamespace( "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse"); OMElement usernameTokenEl = factory.createOMElement("UsernameToken", SecurityElementNamespace); OMElement usernameEl = factory.createOMElement("Username", SecurityElementNamespace); OMElement passwordEl = factory.createOMElement("Password", SecurityElementNamespace); OMElement actionEl = factory.createOMElement("Action", SecurityElementNamespace); passwordEl.addAttribute(factory.createOMAttribute("Type", null, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText")); usernameEl.setText(""); passwordEl.setText(""); usernameTokenEl.addChild(usernameEl); usernameTokenEl.addChild(passwordEl); usernameTokenEl.addChild(actionEl); SOAPHeaderBlockImpl block = new SOAP11HeaderBlockImpl("Security", SecurityElementNamespace, factory); block.addChild(usernameTokenEl); //加入head头 stub._getServiceClient().addHeader(block); //调用 HelloStub.BuissnessInfo info = stub.getList(gg).get_return(); //返回 String ss =info.getCode(); HelloStub.User[] strArray = info.getUser(); for (HelloStub.User s : strArray) System.out.println("id="+s.getId()+"name="+s.getName()); System.out.println(ss); } }
以上都是我在网上查询的资料整合,希望对大家有需求的有帮助,谢谢,希望共同探讨,同时,,我正对AXIS2在服务端对Header头报文的验证 很郁闷!!!!,期望 有高手给指点下,谢谢