您的位置:首页 > 运维架构 > Tomcat

使用Axis在Tomcat下发布Webservice操作指南

2009-09-23 10:20 441 查看
最近在工作过程中总是需要向其它项目组提供Webservice的接口,由于开始需求不是很明确,接口的定义经常需要变更,每一次下来都需要将Java到wsdl,从wsdl到Java,再根据wsdd文件在tomcat上deploy服务这个过程重复一遍.在这个过程中经常出现一些问题,尤其是长期不用axis之后再突然这么用上一用的时候,总是有或多或少的问题存在,遂经上述过程的一些详细操作步骤整理了一些,供参考.

使用Axis在Tomcat下发布Webservice有如下几个步骤:

(1)用JavaBean写好要发布的服务的定义

(2)使用Java2WSDL命令,根据JavaBean生成WSDL文件

(3)使用Wsdl2Java命令,根据WSDL文件生成服务端源代码,以及deploy.wsdd文件

(4)根据deploy.wsdd文件在tomcat下发布Webservice服务

(1)用JavaBean写好要发布的服务的定义

以用户注册为例,需要提供如下样式的用户注册服务,输入参数为com.huawei.mtv.commons.services.schemas.UserRegisterEvt,输出参数为com.huawei.mtv.commons.services.schemas.UserRegisterResp.

UserManage接口文件定义:

package com.huawei.mtv.commons.services;
import com.huawei.mtv.commons.services.schemas.UserRegisterEvt;
import com.huawei.mtv.commons.services.schemas.UserRegisterResp;
public class UserManage
{
public UserRegisterResp register(UserRegisterEvt evt)
{
return null;
}
}


输入参数UserRegisterEvt源代码:

package com.huawei.mtv.commons.services.schemas;
public class UserRegisterEvt  implements java.io.Serializable {
private int accessCode;
private java.lang.String level;
private java.lang.String userId;
public UserRegisterEvt(){
}

public int getAccessCode(){
return accessCode;
}

public void setAccessCode(int accessCode){
this.accessCode = accessCode;
}

public java.lang.String getLevel(){
return level;
}

public void setLevel(java.lang.String level){
this.level = level;
}

public java.lang.String getUserId(){
return userId;
}

public void setUserId(java.lang.String userId){
this.userId = userId;
}
}


输出参数UserRegisterResp源代码:

package com.huawei.mtv.commons.services.schemas;
public class UserRegisterResp  implements java.io.Serializable {
private java.lang.String description;
private java.lang.String returnCode;
public java.lang.String getDescription(){
return description;
}

public void setDescription(java.lang.String description){
this.description = description;
}

public java.lang.String getReturnCode()	{
return returnCode;
}

public void setReturnCode(java.lang.String returnCode){
this.returnCode = returnCode;
}
}


在Eclipse环境下将上述定义文件导出为mtv-common.jar包.至此第一步算是完成了.

(2)使用Java2WSDL命令,根据JavaBean生成WSDL文件

这里我使用的是axis-1_4版本,具体使用到的jar包(只使用了axis-1_4中lib目录中自带的jar包)和命令参见如下代码。

java2wsdl.bat批处理文件 :

set axis_home=D:/software/axis2/axis-1_4/lib
set axis_path=%axis_home%/axis-ant.jar
set axis_path=%axis_path%;%axis_home%/axis.jar
set axis_path=%axis_path%;%axis_home%/commons-discovery-0.2.jar
set axis_path=%axis_path%;%axis_home%/commons-logging-1.0.4.jar
set axis_path=%axis_path%;%axis_home%/jaxrpc.jar;
set axis_path=%axis_path%;%axis_home%/log4j-1.2.8.jar
set axis_path=%axis_path%;%axis_home%/mtv-common.jar
set axis_path=%axis_path%;%axis_home%/saaj.jar
set axis_path=%axis_path%;%axis_home%/wsdl4j-1.5.1.jar
set CLASSPATH=%CLASSPAHT%;%axis_path%
java org.apache.axis.wsdl.Java2WSDL -n "urn:UserManage"  -p"com.huawei.mtv.commons.services" "urn:UserManage" -o "UserManage.wsdl" -l "http://localhost:8080/axis/services/UserManage"   com.huawei.mtv.commons.services.UserManage


执行上述批处理文件之后就生成了UserManage.wsdl文件了.

Java2WSDL命令的个参数含义如下:

-o:指定输出的WSDL文件的文件名。

-l:指定服务的位置。

-n:WSDL文件的目标名字空间。

-p:指定从package到名字空间的映射,这里可以有多个映射。


要注意如下几点:

-o -l -n -p这些选项最好与后面选项对应的值之间没有空格,尤其是-p参数,有空格的话在生成WSDL文件的时候会报错.

(3)使用Wsdl2Java命令,根据WSDL文件生成服务端源代码,以及deploy.wsdd文件

使用如下wsdl2java.bat批处理文件来生成Webservice服务端和客户端源代码.

set axis_home=D:/software/axis2/axis-1_4/lib
set axis_path=%axis_home%/axis-ant.jar
set axis_path=%axis_path%;%axis_home%/axis.jar
set axis_path=%axis_path%;%axis_home%/commons-discovery-0.2.jar
set axis_path=%axis_path%;%axis_home%/commons-logging-1.0.4.jar
set axis_path=%axis_path%;%axis_home%/jaxrpc.jar;
set axis_path=%axis_path%;%axis_home%/log4j-1.2.8.jar
set axis_path=%axis_path%;%axis_home%/mtv-common.jar
set axis_path=%axis_path%;%axis_home%/saaj.jar
set axis_path=%axis_path%;%axis_home%/wsdl4j-1.5.1.jar
set CLASSPATH=%CLASSPAHT%;%axis_path%
java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true UserManage.wsdl


执行上述批处理文件之后会生成源代码的目录与结构如下:

UserManage_pkg包下生成文件如下:

deploy.wsdd
undeploy.wsdd
UserManage.java
UserManageService.java
UserManageServiceLocator.java
UserManageSoapBindingImpl.java
UserManageSoapBindingSkeleton.java
UserManageSoapBindingStub.java


另外也生成了com包,该包下的java文件与我们最初在第一步定义的文件基本相同.

利用Eclipse将上述生成的Java代码进行编译,导出为mtv-service.jar

(4)根据deploy.wsdd文件在tomcat下发布Webservice服务

将axis-1_4/webapps目录下的axis直接拷贝到tomcat/webapps目录下,再将mtv-service.jar包放到tomcat/webapps/axis/WEB-INFO/lib目录下,将tomcat启动,执行如下deploy.bat批处理命令即可发布UserManage服务了.

deploy.bat批处理文件如下:

set axis_home=D:/software/axis2/axis-1_4/lib
set axis_path=%axis_home%/axis-ant.jar
set axis_path=%axis_path%;%axis_home%/axis.jar
set axis_path=%axis_path%;%axis_home%/commons-discovery-0.2.jar
set axis_path=%axis_path%;%axis_home%/commons-logging-1.0.4.jar
set axis_path=%axis_path%;%axis_home%/jaxrpc.jar;
set axis_path=%axis_path%;%axis_home%/log4j-1.2.8.jar
set axis_path=%axis_path%;%axis_home%/saaj.jar
set axis_path=%axis_path%;%axis_home%/wsdl4j-1.5.1.jar
set CLASSPATH=%CLASSPAHT%;%axis_path%
java org.apache.axis.client.AdminClient -l"http://localhost:9000/axis/services/UserManage" deploy.wsdd


经过上述4大步骤,我们的UserManage服务就顺利发布了.

通过http://localhost:9000/axis/servlet/AxisServlet即可查看到刚才发布UserManage服务了.

注意:

在存在server-config.wsdd文件的时候上述方式发布Webservice服务则可能出现错误,这时我们可以先将原来的server-config.wsdd文件重新命名,在按照上述步骤(4)的方式发布服务,会再次生成新的server-config.wsdd文件。我们可以将新生成的文件中类似如下代码块复制到原来的server-config.wsdd文件中就可以将新的需要发布的服务合并到原来的服务中去,实现新老服务共存。

<service name="UserManage" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="typeMappingVersion" value="1.2"/>
<parameter name="wsdlPortType" value="UserManage"/>
<parameter name="className" value="UserManage_pkg.UserManageSoapBindingSkeleton"/>
<parameter name="wsdlServicePort" value="UserManage"/>
<parameter name="wsdlTargetNamespace" value="urn:UserManage"/>
<parameter name="wsdlServiceElement" value="UserManageService"/>
<parameter name="schemaUnqualified" value="http://schemas.services.commons.mtv.huawei.com"/>
<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns1:UserRegisterEvt" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.huawei.mtv.commons.services.schemas.UserRegisterEvt" xmlns:ns1="http://schemas.services.commons.mtv.huawei.com"/>
<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns2:UserRegisterResp" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.huawei.mtv.commons.services.schemas.UserRegisterResp" xmlns:ns2="http://schemas.services.commons.mtv.huawei.com"/>
</service>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: