由于项目中需要开发一个彩信接口,用来收发SOAP消息,便用AXIS开发了一个webservice,也加深了对web服务的理解,为以后开发类似的webservice接口积累了经验。
1、下载AXIS相应的包,设置环境变量。
先设置包的路径LIB_HOME=D:/axis/../../lib,然后设置相应的包AXIS_PATH=%LIB_HOME%/axis.jar;
%LIB_HOME%/axis-ant.jar;
%LIB_HOME%/jaxrpc.jar;
%LIB_HOME%/commons-logging-1.0.4.jar;
%LIB_HOME%/commons-discovery-0.2.jar;
%LIB_HOME%/saaj.jar;
%LIB_HOME%/activation.jar;
%LIB_HOME%/mail.jar;
%LIB_HOME%/wsdl4j-1.5.1.jar;
%LIB_HOME%/xerces.jar, 最后设置classpath的路径%AXIS_PATH%。
将标准的wsdl文件拷贝到工程src目录下,进入cmd命令模式,D:/workspace/工程名/src>
java org.apache.axis.wsdl.WSDL2Java -s -S true MSMP.wsdl 生成skeleton类到相应的路径。
wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。
命令行格式为:WSDL2Java [options] -uri <url or path> : A url or path to a WSDL
其中常用的options具体如下:
-o <path> : 指定生成代码的输出路径
-a : 生成异步模式的代码
-s : 生成同步模式的代码
-p <pkg> : 指定代码的package名称
-l <languange> : 使用的语言(Java/C) 默认是java
-t : 为代码生成测试用例
-ss : 生成服务端代码 默认不生成
-sd : 生成服务描述文件 services.xml,仅与-ss一同使用
-d <databinding> : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
-g : 生成服务端和客户端的代码
-pn <port_name> : 当WSDL中有多个port时,指定其中一个port
-sn <serv_name> : 选择WSDL中的一个service
-u : 展开data-binding的类
-r <path> : 为代码生成指定一个repository
-ssi : 为服务端实现代码生成接口类
-S : 为生成的源码指定存储路径
-R : 为生成的resources指定存储路径
--noBuildXML : 输出中不生成build.xml文件
--NowSDL : 在resources目录中不生成WSDL文件
--noMessageReceiver : 不生成MessageReceiver类
3、编写业务实现类,修改deploy.wsdd发布文件,先部署一个web服务器,如用Resin,把deploy.wsdd文件拷贝到classes上一级目录,也就是WEB-INF下,运行命令:
java -cp
D:/../lib/activation.jar;
D:/../lib/axis.jar;
D:/../lib/axis-ant.jar;
D:/../lib/commons-discovery.jar;
D:/../lib/commons-httpclient-3.0-alpha1.jar;
D:/../lib/commons-logging.jar;
D:/../lib/jaxrpc.jar;
D:/../lib/log4j-1.2.8.jar;
D:/../lib/mail.jar;
D:/../lib/saaj.jar;
D:/../lib/wsdl4j.jar
org.apache.axis.client.AdminClient -lhttp://localhost:8080/services/MaPort deploy.wsdd
要注意包的路径,Processing file deploy.wsdd <Admin>Done processing</Admin>表示发布成功。
4、添加头响应类来处理SOAP头消息,在server-config.wsdd文件中添加业务实现方法,头消息处理。
<operationname=""qname=""returnQName=""returnType="" xmlns:ns1="" xmlns:ns2="">
<parameter qname="" type="" />
</operation>
<responseFlow>
<handler name="httpRequest" type="java:com.package">
</handler>
</responseFlow>
<responseFlow>
<handler name="httpResponse" type="java:com.package">
</handler>
</responseFlow>
5、通过服务端生成wsdl文件,用wsdl2java工具将wsdl反向生成客户端需要的实体类。
6、编写客户端代码,发送SOAP请求到服务端进行测试:
public class Test {
public void getApple() {
String
targetEendPoint= "http://localhost:8802/services/MaPort";
//创建service类
Service service = new Service();
//定义调用WebService类
Call call;
try {
//定义传入参数类
SyncOrderRelationReqType req = new SyncOrderRelationReqType();
//设置属性
req.setFeeUser_ID(new User_id_schema(BigInteger.valueOf(1),
"130×××××××", new byte[]{0}));
req.setMsgType("SyncOrderRelation");
req.setVersion("1.0.0");
req.setSPServiceID("161200");
req.setSPID("44836");
req.setActionReasonID(BigInteger.valueOf(1));
req.setDestUser_ID(new User_id_schema(BigInteger.valueOf(1),"130×××××××",new byte[]{0}));
req.setSend_Address(new Address_info_schema(BigInteger.valueOf(0),"827003"));
req.setDest_Address(new Address_info_schema(BigInteger.valueOf(400),"130×××××××"));
req.setFeeUser_ID(new User_id_schema(BigInteger.valueOf(1),new byte[]{0}));
req.setActionID(BigInteger.valueOf(1));
MSMPLocator msmp = new MSMPLocator(); msmp.setmaPortEndpointAddress("http://localhost:8802/services/MaPort");
MaPort ma = msmp.getmaPort();
SyncOrderRelationRespType result = ma.syncOrderRelation(req);
System.out.println(result.getVersion()+result.getHRet());
} catch (Exception e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
public static void main(String[] args) {
Test tes = new test();
tes.getApple();
}
}
备注:
1、将WebService发布到服务器的时候由于JDK的版本不同会导致jar包冲突,JDK1.4版本的保留saaj.jar, 删除saaj-api-1.3.jar,saaj-impl-1.3.jar包,不然会导致服务器报异常。
2、最好用deploy.wsdd来发布web服务,这样可以保证server-config.wsdd配置文件的设置项是完整的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。