WebService 四种发布方式总结
                            Author:yczhang
1. CXF方式
CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题是cxf与was6.1.1不兼容,表现在cxf必须的jar包“wsdl4j-1.6.2.jar”报错,报的错为: java.lang.IncompatibleClassChangeError,明显的jar包不兼容问题,很是头痛,后来查资料到解决办法是,将上述jar包新建一个was共享库,可以解决,但是客户周经理不想用此种方式,因为需要修改was,于是改用了axis2方式,下文会介绍。该问题在此处做个记录,以后使用cxf与was的时候需要注意!!!
使用cxf+spring搭建WebService:
第一步,添加jar包。此处需要注意,不同环境(tomcat、was)jar也不一定相同,例如我本地cxf+spring只需要如下jar包:
而泰康的was环境则需要如下jar包:
明显的多了很多,原因应该是服务器jar包池的不同。根据错误提示缺什么补什么就可以了,注意jar包勿重复。
第二步,配置l文件,如下(重要的地方已标记):
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/l</param-value>
    </context-param>
      <listener>    <listener-class>org.t.ContextLoaderListener</listener-class>
      </listener>
     
    <filter>
        <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>   
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
      <servlet>
        <servlet-name>CXFServlet</servlet-name>  <servlet-class>f.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
          <servlet-name>CXFServlet</servlet-name>
          <url-pattern>/webservice/*</url-pattern>
    </servlet-mapping>
上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;

第三步,编写接口类与实现类,注意注解
接口类
@WebService
public interface SendService {
    public boolean sendOA(@WebParam(name="param")String param);
   
    public boolean sendOrg(OrgEntity org);
}
实现类
@WebService(endpointInterface="com.service.SendService",serviceName="sendService")
public class SendServiceImpl implements SendService{
    public boolean sendOA(String param) {
        System.out.println("-------sendOA---------param:"+param);
        if(param.equals("zhoujian")){
            return true;
        }
        return false;
    }
    public boolean sendOrg(OrgEntity org) {
        System.out.println("-------sendOrg--begin-------");
        return true;
    }
}
第四步,Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="/schema/beans"
    xmlns:xsi="/2001/XMLSchema-instance"
    xmlns:p="/schema/p"
    xmlns:jaxws="/jaxws"
    调用webservice服务xsi:schemaLocation="
          /schema/beans
          /schema/beans/spring-beans.xsd
          /jaxws
          /schemas/jaxws.xsd">
    <import resource="classpath:META-INF/l"/>
      <import resource="classpath:META-INF/l"/>
      <import resource="classpath:META-INF/l"/>
     
      <jaxws:endpoint id="sendServie" implementor="com.service.impl.SendServiceImpl"
                    address="/sendServie" />
    <!-- <jaxws:client id="sendServiceClient" serviceClass="com.service.SendService"
        address="10.137.138.11:9080/Wb/webservice/sendServie?wsdl"  />-->
</beans>
“jaxws:client”该标签可以不必写,访问时可以手动拼接该url
第五步,发布,直接部署到服务器,访问:
10.137.138.11:9080/Wb/webservice/sendServie?wsdl

2. Xfire方式
据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。
Xfire方式发布webservice:
第一步,添加jar包,如下:
第二步,修改l文件
<servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class&ansport.http.XFireConfigurableServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
第三步,编写接口类
接口类:
public abstract interface IBankingService {
    public abstract String transferFunds(String paramString1);
}
实现类:
public class BankingService implements IBankingService{
  public String transferFunds(String fromAccount)
  {
    return fromAccount+":ok";
  }
}
第四步,编写l配置文件
在WEB-INF目录下新建目录META-INF,在该目录下新建文件夹xfire,该目录下新建文件l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/config/1.0">
    <service>
    <name>Banking</name>
    <namespace>mybank</namespace>
    <serviceClass>
    ample.IBankingService
    </serviceClass>
    <implementationClass>
    bank.xfire.impl.BankingService
    </implementationClass>
    </service>
</beans>
第五步,发布,部署到服务器,访问url:
localhost:9080/Xfire/services/Banking?wsdl

3. AXIS2方式
Axis2发布WebService有两种方式,其一是利用axis2插件打成aar包放到axis_war里面部署到服务器发布;其二是不打包发布(本例);我不清楚打包发布有什么好处,感觉很麻烦项目外还得部署一个war,现在介绍第二种不打包的方式,类似xfire,同时由于cxf与was不兼容导致wsdl.jar报错,但是xfire与axis2也用到wsdl.jar却不报错,我个人也是很费解,泰康项目目前使用的就是axis2方式。
Axis2发布WebService:
第一步,添加jar包,如下:
很多是吧,不过都是从axis.war里面WEB-INF下的lib目录复制来的。
第二步,修改l文件
<servlet>
        <servlet-name>AxisServlet</servlet-name>  <servlet-class>org.ansport.http.AxisServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

第三步,编写实现类
public class ServiceImpl {
    public String sayHello(String name){
        System.out.println("================");
        return "hello:"+name;
    }
}
第四步,增加WEN-INF内容
将axis.war解压下的WEN-INF文件夹内的conf、modules复制到项目WEB-INF下
第五步,在WEB-INF下创建文件夹services(名字不可改),在该目录下创建文件夹(名称随意),在该目录下创建文件夹META-INF(名称不可改),在该目录下创建文件l(名称不可改),该文件内容为:
<?xml version="1.0" encoding="UTF-8"?>
<service name="axisDemo">
    <description>
        Web Service例子
    </description>
    <parameter name="ServiceClass">
      com.ServiceImpl
    </parameter>
    <messageReceivers>
        <messageReceiver mep="/2004/08/wsdl/in-out"
            class="org.apache.ivers.RPCMessageReceiver" />
        <messageReceiver mep="/2004/08/wsdl/in-only"
      class="org.apache.ivers.RPCInOnlyMessageReceiver" />
    </messageReceivers>
</service>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。