最近项目用到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头报文的验证 很郁闷!!!!,期望 有高手给指点下,谢谢