cxf动态配置URL

创建项目骨架

启动 Eclipse,创建一个 Java Project,如果是 WTP 的话,可以直接创建一个 J2EE Web 项目,我们取名为 CXF_Server_01,并设置编译的 output 路径为 WEB-INF/classes 目录,方便直接部署应用程序。

目录结构如下图所示:

为了方便起见,我们直接拷贝 %CXF_HOME%/lib 目录下的所有 .jar 文件到 CXF_Server_01 项目的 WEB-INF/lib 目录下,也可以根据前面“CXF 安装包章节所述的各个 jar 包的作用范围选择仅需要的 .jar 文件。在 Eclipse 里刷新后,可以看到如下结构:

并在 CXF_Server_01 项目属性里将这些 .jar 加到 Java Build Path 当中去,如下图:

这样,项目的基本骨架已经创建完成,接下来开始编写接口与具体实现的代码了。

 

 

接口类创建

在项目的 src 目录中新建一个 ws.cxf 包,并在里面创建接口类 ISurveyService.java,为了简单示示例起见,我们仅创建一个方法 public String vote(String username,int point); 这里要注意的是我们在接口上用 @WebService 注解标明这是一个即将暴露为 Web Service 的接口,并将里面的方法都暴露出去。完整的接口代码清单如下

package ws.cxf;
 
import javax.jws.WebService;
 
@WebService
public interface ISurveyService
{
         /**
          * @param username 名字
          * @param point 分数
          * @return
          */
         public String vote(String username,int point);
}

 

 

 

具体类实现

针对接口的定义,我们创建一个相应的实现类,并将其定义在 ws.cxf.impl 包中,完整的代码清单如下:

package ws.cxf.impl;

 

import javax.jws.WebService;

import ws.cxf.ISurveyService;

 

@WebService

public class SurveyService implements ISurveyService

{

    private String excludeName;

    private int leastPonit;

 

    public String vote(String username,int point)

    {

       String result = "";

       if(excludeName.equals(username))

       {

           result = " 您不能重复进行投票!";

       }

       else

       {

           result = " 谢谢您的投票!";

           if(point < leastPonit)

           {

              result += " 您的投票分数太低!";

           }

           else

           {

              result += " 您的投票分数通过审核!";

           }

       }

       return result;

    }

 

    // For IoC

    public String getExcludeName()

    {

       return excludeName;

    }

 

    public void setExcludeName(String excludeName)

    {

       this.excludeName = excludeName;

    }

 

    public int getLeastPonit()

    {

       return leastPonit;

    }

 

    public void setLeastPonit(int leastPonit)

    {

       this.leastPonit = leastPonit;

    }

}

 

 

Spring 配置

src 目录中创建 beanRefServer.xml 文件,用来定义 Spring Bean 的配置,CXF 支持 Spring 2.0 Schema 标签配置方式,并且提供快捷暴露 Web Services 的标签。

首先,我们需要引入 Spring CXF 的命名空间(namespace),如下:

<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">

 

这样,我们可以使用 Spring CXF 的标签配置了。接着,我们需要引入我们所需要的 CXF Bean 定义文件,如下:

    <!-- 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"/>

 

接着定义我们具体实现的 Bean ,这个 Bean 的定义与 Spring 普通的 Bean 定义是一样的:

    <!-- SurveyService -->

    <bean id="surveyService" class="ws.cxf.impl.SurveyService">

        <property name="excludeName" value="Michael"/>

        <property name="leastPonit" value="10"/>

    </bean>

 

最后,将定义的 Bean 暴露出去成为 Web Service 服务,通过 CXF 提供的 Schema 标签配置 <jaxws:server> ,这样定义的配置显得更加简洁与方便,定义如下:

    <!-- Expose SurveyWebService -->

    <jaxws:server id="surveyWebService"

        serviceClass="ws.cxf.ISurveyService"

        address="/SurveyWebService">

        <jaxws:serviceBean>

            <ref bean="surveyService"/> <!-- 要暴露的 bean 的引用 -->

            </jaxws:serviceBean>

    </jaxws:server>

 

在配置中,serviceClass 的值是我们的接口类的名称,address 为将要暴露出去的 Web Service 访问地址。比如:/SurveyWebService,那么客户端消费 Web Service 的地址就会成为 http://host:port/WebAPPName/SurveyWebService ,与之相应的 WSDL 地址则为: http://host:port/WebAPPName/SurveyWebService?wsdl

 

 

Web 应用配置

由于我们的示例是需要通过 Servlet 容器进行服务暴露,因此需要配置相对应的 web.xml 文件,首先是增加 Spring 的配置文件加载 Listener,如下:

    <!-- Spring Config Location -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/classes/beanRefServer.xml</param-value>

    </context-param>

    <!-- Spring ContextLoaderListener -->

    <listener>

        <listener-class>

            org.springframework.web.context.ContextLoaderListener

        </listener-class>

    </listener>

 

接下来配置 CXF Servlet 的定义,以及它的映射,如下:

    <!-- Apache CXFServlet -->

    <servlet>

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

        <display-name>CXF Servlet</display-name>

        <servlet-class>

            org.apache.cxf.transport.servlet.CXFServlet

        </servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <!-- CXFServlet Mapping -->

    <servlet-mapping>

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

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

    </servlet-mapping>

 

我们将之映射为 /* 。这样,服务端的代码与配置就全部完成了,接下来就是将应用程序部署到 Web 容器中去,并验证服务是否正常发布。

 

消费服务

回到 Eclipse 开发平台,我们在这里使用cxf动态配置URL(使用beanRefClient.xml 配置文件来配置可以参考--技术文档/ web service描述.doc), 创建一个 Java Project,如果是 WTP 的话,可以直接创建一个 J2EE Web 项目,我们取名为 CXF_Client_01准备工作参见: 创建项目骨架 的系列步骤。

 

使用cxf动态配置URL,仅仅需要创建与具体webservice技术无关的业务接口就可以了,不需要引入beanRefClient.xml 配置文件。利用代理类进行发布服务和获取服务:

package ws.cxf.impl;

 

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

 

public class JaxWsProxyFactoryBeanImpl {

    private static JaxWsProxyFactoryBean jaxWsProxyFactoryBean;

    static{

       jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();

    }

   

    public static JaxWsProxyFactoryBean getJaxWsProxyFactoryBean(){

       return  jaxWsProxyFactoryBean;

    }

   

    public static Object getProxyFactoryBean(Class serviceClass,String address){

         //设置服务接口类

       jaxWsProxyFactoryBean.setServiceClass(serviceClass);

/**

address 也就是wsdl文件中的 <soap:address location="http://localhost: :8080/CXF_Server_01/cxf/SurveyWebService" />

*/

       jaxWsProxyFactoryBean.setAddress(address);

        //创建服务,返回一个代理对象

       return jaxWsProxyFactoryBean.create();

    }

}

接下来我们编写访问的具体代码,在 test 目录下创建 ws.cxf.client 包,然后创建 SurveyServiceClient.java,完整的代码如下:

package ws.cxf.client;

 

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

 

import ws.cxf.inter.ISurveyService;

 

import ws.cxf.impl.JaxWsProxyFactoryBeanImpl;

 

public class SurveyServiceClient

{

    private JaxWsProxyFactoryBean identityValidateServiceClientFactory;

 

    public static void main(String[] args)

    {      

        String address = "http://192.168.0.63:8080/CXF_Server_01/cxf/SurveyWebService";

        ISurveyService surveyService = (ISurveyService)JaxWsProxyFactoryBeanImpl.getProxyFactoryBean(ISurveyService.class, address);

       

        // 1、定义调查投票的变量与内容,用来发送给服务

        String username = "Test";

        int point = 88;

        // 调用方法进行服务消费

        String result = surveyService.vote(username,point);

        System.out.println("Result:" + result);

        // 2、传递不一样的调查投票内容

        username = "Michael";

        point = 100;

        // 再次调用方法进行服务消费,得到不一样的结果

        result = surveyService.vote(username,point);

        System.out.println("Result:" + result);

        // 3、第三次传递与调用

        username = "Jordan";

        point = 11;

        result = surveyService.vote(username,point);

        System.out.println("Result:" + result);

    }

 

    public JaxWsProxyFactoryBean getIdentityValidateServiceClientFactory() {

        return identityValidateServiceClientFactory;

    }

 

    public void setIdentityValidateServiceClientFactory(

            JaxWsProxyFactoryBean identityValidateServiceClientFactory) {

        this.identityValidateServiceClientFactory = identityValidateServiceClientFactory;

    }

}

 

直接运行以上客户端消费程序,一共调用了三次 Web Service,并得到结果如下:

Result: 谢谢您的投票!您的投票分数通过审核!

Result: 您不能重复进行投票!

Result: 谢谢您的投票!您的投票分数太低!

 

于是服务正常地得到了调用,并且能够正确地返回结果,

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值