最近项目用到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头报文的验证 很郁闷!!!!,期望 有高手给指点下,谢谢
分享到:
相关推荐
在嵌入式系统设计中,AXI (Advanced eXtensible Interface) 和 APB (Advanced Peripheral Bus) 是两种常见的总线协议,它们用于处理器与其他硬件组件之间的通信。SPI (Serial Peripheral Interface) 则是一种简单的...
AXI_HP(High-Performance...总的来说,这个压缩包提供的代码示例是针对ARM9处理器的AXI_HP接口实现PL端到PS端的内存读写功能,通过理解AXI协议的原理和信号交互,可以进一步深入学习和优化代码以适应不同的应用需求。
在IT行业中,Web服务是一种广泛使用的技术,它允许不同系统之间通过互联网进行...通过学习和实践这个示例,你将对AXI2和Maven在Web服务开发中的应用有更深入的理解。同时,这也将帮助你快速上手其他复杂的Web服务项目。
总之,"AXI&APB2SPI_spiapb_spi转APB_axi数据转spi_axi总线_SPI2APB_源码.zip"提供的源代码可能是一个关键的硬件接口IP,对于需要在AXI或APB系统中集成SPI设备的设计者来说,这是一个非常有价值的资源。
emif 接口转axi总线,测试功能正常使用,不包含仿真文件
通过这些源码和验证工程,学习者可以深入理解AXI总线的工作原理,包括地址、数据、控制信号的交互,以及如何在VIVADO这样的开发环境中实现和调试AXI设计。同时,通过模拟和实际板级测试,能够检验设计的正确性和性能...
### AMBA AXI3.0, AXI4.0, 和 AXI5.0 协议详解 #### 一、AMBA AXI 协议概述 AMBA (Advanced Microcontroller Bus Architecture) 是一种开放标准总线协议体系结构,主要用于芯片内各组件之间的通信。ARM 公司开发了...
2. 数据缓冲区:用于暂存AXI总线传输的数据,以便在AHB总线上按照其时序规则进行传输。 3. 控制信号转换逻辑:处理AXI和AHB之间的握手信号,如读/写使能、应答和等待状态信号。 4. 错误处理:检测和报告潜在的协议...
总结来说,AXI_AD9361项目是一个基于Verilog的硬件驱动实现,利用AXI总线协议与AD9361收发器进行通信,实现了数据的高效传输。这个工程不仅涉及到高级的硬件描述语言编程,还需要深入理解AXI协议和AD9361的特性,...
在实际学习过程中,结合这些代码示例进行实践将有助于加深对AXIS2客户端调用的理解。 总的来说,掌握AXIS2客户端调用的不同方式对于开发高质量的Web服务至关重要。理解并熟练运用这些方法,可以让你在处理分布式...
在这个“zynq pl通过axi总线读写ps端ddr”的项目中,重点在于实现PL中的AXI DDR控制器。控制器的设计通常包括地址映射、读写请求的生成、数据的传输以及必要的等待状态控制。开发者需要精确地控制时钟域之间的数据...
在本资料“AXI4_specification.rar”中,包含了关于AXI4协议的详细规格书,对于AXI总线的开发者来说,是一份不可或缺的参考资源。 AXI4协议的核心在于其分层和异步的设计,允许不同速度和带宽的组件进行有效通信。...
在你提供的"axi_lite.rar"压缩包中,包含了一个使用Vivado 2018.2版本设计的AXI-LITE回环工程。这个工程允许数据从处理器系统(PS)写入,经过可编程逻辑(PL)中的AXI-LITE接口,然后返回到处理器系统,并通过串口...
2. **AXI4**:AXI4在AXI3的基础上增加了流(Stream)接口和重叠读写功能,使得多个连续数据传输可以在同一时间进行。此外,它引入了写响应通道,确保写操作的顺序性和正确性。 3. **AXI4-Lite**:针对资源有限的...
AXI4(Advanced eXtensible Interface 4)是一种高性能的接口规范,广泛应用于FPGA和ASIC设计中,用于在处理器、存储器和其他系统组件之间传输数据。它提供了多种通道,包括数据(Write Data和Read Data)、地址...
在实际应用中,开发者可以利用这个AXI Master模块直接在他们的设计中,通过修改配置参数以适应具体需求,或者作为学习AXI协议和VHDL设计的实例。通过深入理解和使用这些代码,不仅可以提高设计效率,也能增强对AXI...
### AXI协议详解 #### 一、概述 AXI(Advanced eXtensible Interface)协议作为AMBA(Advanced Microcontroller Bus Architecture)3.0规范的一部分,是ARM公司为解决高性能处理器设计中的通信瓶颈问题而提出的一...
理解AXI协议需要深入学习其地址空间、事务类型、握手信号、数据包格式等内容。通过阅读中文和英文版本的文档,你可以详细了解这些概念,以及如何在实际设计中应用AXI协议来优化系统的性能和功耗。对于硬件设计师来说...
这些源代码将定义数据传输路径,包括如何从输入接收数据,如何通过AXI Stream接口传输,以及如何在输出端处理数据。 2. **测试向量**:测试向量用于验证AXI Stream IP核的正确性。它们提供了一组预定义的数据输入,...
### ZYNQ中AXI4、AXI4-Lite与AXI4-Stream协议详解 #### 一、AXI4协议概述 AXI4(Advanced eXtensible Interface)是ARM公司开发的一种高性能、可扩展的接口标准,主要用于连接处理器和其他外围设备。AXI4协议支持...