CXF简单实现web service服务器端

来源:互联网 发布:linux显示环境变量 编辑:程序博客网 时间:2024/06/01 08:55

一,        目的

1.       通过cxf实现webservice服务器端的发布,从而为其他应用提供接口服务

2.       通过cxf调用其他应用提供的webservice服务

 

二,        说明

此处Cxf 采用的版本为2.1.3cxf的工具包网上有免费下载。

 

三,        服务器端实现步骤

 

1.      cxf工具包中apache-cxf-2.1.3/lib目录下的所有jar包引入工程里

 

2.      web.xml上配置如下:

<servlet>

       <servlet-name>CXFServlet</servlet-name>

       <servlet-class>

           com.boco.sso.common.servlet.NonSpringServlet

       </servlet-class>

       <load-on-startup>0</load-on-startup>

    </servlet>

<servlet-mapping>

       <servlet-name>CXFServlet</servlet-name>

       <url-pattern>/service/*</url-pattern>

</servlet-mapping>

 

3. 自己编写一个servlet实现CXFNonSpringServlet,并且重写loadBus方法。

 

package com.boco.sso.common.servlet;

 

import java.util.ArrayList;

import java.util.List;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.xml.ws.Endpoint;

import org.apache.cxf.Bus;

import org.apache.cxf.BusFactory;

import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;

import org.apache.cxf.frontend.ServerFactoryBean;

import org.apache.cxf.transport.servlet.CXFNonSpringServlet;

import org.apache.ws.security.WSConstants;

import org.apache.ws.security.handler.WSHandlerConstants;

 

import com.boco.sso.server.MyCallbackHandler;

import com.boco.sso.server.MySoapInterceptor;

import com.boco.sso.server.SSOServerImpl;

 

public class NonSpringServlet extends CXFNonSpringServlet {

   

   

     public void loadBus(ServletConfig servletConfig) throws ServletException {

          super.loadBus(servletConfig);

        // You could add the endpoint publish codes here

        

//          Bus bus = this.getBus();

//          BusFactory.setDefaultBus(bus);

//          Endpoint.publish("/sso", new SSOServerImpl());        

            // You can als use the simple frontend API to do this

            ServerFactoryBean factroy = new ServerFactoryBean();

            factroy.setBus(bus);

            factroy.setServiceClass(SSOServerImpl.class);

            factroy.setAddress("/sso");             

         //   factroy.getInInterceptors().add(new MySoapInterceptor());//判断ip

            factroy.create();             

        }

 

 

}

 

 

SSOServerImpl.class 为接口实现类。

/sso 为发布的服务名

webservice的发布的地址为:http://工程访问路径/service/sso?wsdl

地址中的service是在web.xml的配置的

<servlet-mapping>

       <servlet-name>CXFServlet</servlet-name>

       <url-pattern>/service/*</url-pattern>

</servlet-mapping>

 

 

3.  重启服务,然后访问发布的地址,如果能看到发布的服务,并能看到生成的wsdl内容,就说明websevice发布成功了。

 

四,        客户端调用

1,       需要提供服务的应用提供一个webservice的发布地址如: http://10.221.9.16:19090/transnms/services/SingleSignon?wsdl

 

2,       classes目录下定义一个beans.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:jaxws="http://cxf.apache.org/jaxws"

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

        http://cxf.apache.org/jaxws

        http://cxf.apache.org/schemas/jaxws.xsd">

    <!-- Import Apache CXF Bean Definition -->

    <import resource="classpath:META-INF/cxf/cxf.xml" />

    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!-- WebService Client -->

<!-- <jaxws:client id="cswg"

                  serviceClass="mobilesso.tnms.ISingleSignon"

                  address="http://10.221.9.16:19090/transnms/services/SingleSignon">

         

    </jaxws:client> -->

 

       <bean id="wss4jOutConfiguration" 

        class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> 

          <constructor-arg> 

           <map> 

               <entry key="action" value="UsernameToken" />

               <entry key="user" value="bocoadmin"/> 

               <entry key="passwordType" value="PasswordText" /> 

               <entry key="passwordCallbackClass" value="auth.WsClinetAuthHandler" /> 

           </map> 

        </constructor-arg>

    </bean>

    

</beans>

 

2.通过wsdl2java的命令生成客户端

 

先进入dos窗口,

进入apache-cxf-2.1.3/bin所在目录,

输入命令:

wsdl2java http://10.221.9.16:19090/transnms/services/SingleSignon?wsdl

命令格式为:wsdl2java  url     其中的URL为要调用的webservice的服务地址

 

 

3.在beans.xml文件中配置要调用的webservice

类似文件中红色注释的内容:

<jaxws:client id="cswg"

                  serviceClass="mobilesso.tnms.ISingleSignon"

                  address="http://10.221.9.16:19090/transnms/services/SingleSignon">

         

</jaxws:client>

 

其中id是自己为该服务起的一个唯一标示,serviceClass为实现接口,在生成的客户端有,address为要调用的webservice地址

   

 

4.  调用

 

定义一个类执行如下代码:

ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");

//拿到webservice服务的操作接口

ISingleSignon iss = (ISingleSignon)app.getBean("cswg");

    //执行服务的具体操作

       List list = iss.getAccount("");

       System.out.println(list.size());

       for(int i=0;i<list.size();i++){

           RemoteUser ru = (RemoteUser)list.get(i);

           System.out.println(ru.getUid()+","+ru.getName());

       }

       System.out.println(iss.authenticate("antest", "abc123"));

       System.out.println(iss.modifypwd("antest","ABC123"));

     //操作结束

app.close();//一定不要忘记将app关掉

 

原创粉丝点击