设为首页 收藏本站
查看: 332|回复: 0

[经验分享] 使用Axis在Tomcat下发布Webservice操作指南

[复制链接]

尚未签到

发表于 2017-2-6 09:33:03 | 显示全部楼层 |阅读模式
  最近在工作过程中总是需要向其它项目组提供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接口文件定义:
  view plaincopy to clipboardprint?
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;  
    }  

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源代码:
  view plaincopy to clipboardprint?
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;  
    }  

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源代码:
  view plaincopy to clipboardprint?
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;  
    }  

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批处理文件 :
  view plaincopy to clipboardprint?
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 
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命令的个参数含义如下:
  view plaincopy to clipboardprint?
-o:指定输出的WSDL文件的文件名。      
 
-l:指定服务的位置。  
          
-n:WSDL文件的目标名字空间。  
          
-p:指定从package到名字空间的映射,这里可以有多个映射。 
-o:指定输出的WSDL文件的文件名。   
  -l:指定服务的位置。
       
-n:WSDL文件的目标名字空间。
       
-p:指定从package到名字空间的映射,这里可以有多个映射。
  要注意如下几点:
  -o -l -n -p这些选项最好与后面选项对应的值之间没有空格,尤其是-p参数,有空格的话在生成WSDL文件的时候会报错.    
  (3)使用Wsdl2Java命令,根据WSDL文件生成服务端源代码,以及deploy.wsdd文件
  
    使用如下wsdl2java.bat批处理文件来生成Webservice服务端和客户端源代码.
  view plaincopy to clipboardprint?
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 
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包下生成文件如下:
  view plaincopy to clipboardprint?
deploy.wsdd  
undeploy.wsdd  
UserManage.java  
UserManageService.java  
UserManageServiceLocator.java  
UserManageSoapBindingImpl.java  
UserManageSoapBindingSkeleton.java  
UserManageSoapBindingStub.java 
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批处理文件如下:    
  view plaincopy to clipboardprint?
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 
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文件中就可以将新的需要发布的服务合并到原来的服务中去,实现新老服务共存。
  view plaincopy to clipboardprint?
<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>  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-338100-1-1.html 上篇帖子: 用CAS实现SSO----简单tomcat实例配置 下篇帖子: Tomcat 5集群中的SESSION复制一(图)(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表