您的位置:首页 > 其它

cxf动态配置URL

2009-12-29 16:19 183 查看
创建项目骨架
启动Eclipse,创建一个JavaProject,如果是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加到JavaBuildPath当中去,如下图:

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

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


importjavax.jws.WebService;


@WebService

publicinterfaceISurveyService

{

/**

*@paramusername名字

*@parampoint分数

*@return

*/

publicStringvote(Stringusername,intpoint);

}

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

importjavax.jws.WebService;
importws.cxf.ISurveyService;

@WebService
publicclassSurveyServiceimplementsISurveyService
{
privateStringexcludeName;
privateintleastPonit;

publicStringvote(Stringusername,intpoint)
{
Stringresult="";
if(excludeName.equals(username))
{
result="您不能重复进行投票!";
}
else
{
result="谢谢您的投票!";
if(point<leastPonit)
{
result+="您的投票分数太低!";
}
else
{
result+="您的投票分数通过审核!";
}
}
returnresult;
}

//ForIoC
publicStringgetExcludeName()
{
returnexcludeName;
}

publicvoidsetExcludeName(StringexcludeName)
{
this.excludeName=excludeName;
}

publicintgetLeastPonit()
{
returnleastPonit;
}

publicvoidsetLeastPonit(intleastPonit)
{
this.leastPonit=leastPonit;
}
}
Spring配置
在src目录中创建beanRefServer.xml文件,用来定义Spring的Bean的配置,CXF支持Spring2.0Schema标签配置方式,并且提供快捷暴露WebServices的标签。
首先,我们需要引入Spring与CXF的命名空间(namespace),如下:
<beansxmlns="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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd">
这样,我们可以使用Spring与CXF的标签配置了。接着,我们需要引入我们所需要的CXF的Bean定义文件,如下:
<!--ImportApacheCXFBeanDefinition-->
<importresource="classpath:META-INF/cxf/cxf.xml"/>
<importresource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>
接着定义我们具体实现的Bean,这个Bean的定义与Spring普通的Bean定义是一样的:
<!--SurveyService-->
<beanid="surveyService"class="ws.cxf.impl.SurveyService">
<propertyname="excludeName"value="Michael"/>
<propertyname="leastPonit"value="10"/>
</bean>
最后,将定义的Bean暴露出去成为WebService服务,通过CXF提供的Schema标签配置<jaxws:server>,这样定义的配置显得更加简洁与方便,定义如下:
<!--ExposeSurveyWebService-->
<jaxws:serverid="surveyWebService"
serviceClass="ws.cxf.ISurveyService"
address="/SurveyWebService">
<jaxws:serviceBean>
<refbean="surveyService"/><!--要暴露的bean的引用-->
</jaxws:serviceBean>
</jaxws:server>
在配置中,serviceClass的值是我们的接口类的名称,address为将要暴露出去的WebService访问地址。比如:/SurveyWebService,那么客户端消费WebService的地址就会成为http://host:port/WebAPPName/SurveyWebService,与之相应的WSDL地址则为:http://host:port/WebAPPName/SurveyWebService?wsdl。

Web应用配置
由于我们的示例是需要通过Servlet容器进行服务暴露,因此需要配置相对应的web.xml文件,首先是增加Spring的配置文件加载Listener,如下:
<!--SpringConfigLocation-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/beanRefServer.xml</param-value>
</context-param>
<!--SpringContextLoaderListener-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
接下来配置CXFServlet的定义,以及它的映射,如下:
<!--ApacheCXFServlet-->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXFServlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--CXFServletMapping-->
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
我们将之映射为/*。这样,服务端的代码与配置就全部完成了,接下来就是将应用程序部署到Web容器中去,并验证服务是否正常发布。

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

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

importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;

publicclassJaxWsProxyFactoryBeanImpl{
privatestaticJaxWsProxyFactoryBeanjaxWsProxyFactoryBean;
static{
jaxWsProxyFactoryBean=newJaxWsProxyFactoryBean();
}

publicstaticJaxWsProxyFactoryBeangetJaxWsProxyFactoryBean(){
returnjaxWsProxyFactoryBean;
}

publicstaticObjectgetProxyFactoryBean(ClassserviceClass,Stringaddress){
//设置服务接口类
jaxWsProxyFactoryBean.setServiceClass(serviceClass);
/**
address也就是wsdl文件中的<soap:addresslocation="http://localhost::8080/CXF_Server_01/cxf/SurveyWebService"/>
*/
jaxWsProxyFactoryBean.setAddress(address);
//创建服务,返回一个代理对象
returnjaxWsProxyFactoryBean.create();
}
}
接下来我们编写访问的具体代码,在test目录下创建ws.cxf.client包,然后创建SurveyServiceClient.java,完整的代码如下:
packagews.cxf.client;

importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;

importws.cxf.inter.ISurveyService;

importws.cxf.impl.JaxWsProxyFactoryBeanImpl;

publicclassSurveyServiceClient
{
privateJaxWsProxyFactoryBeanidentityValidateServiceClientFactory;

publicstaticvoidmain(String[]args)
{
Stringaddress="http://192.168.0.63:8080/CXF_Server_01/cxf/SurveyWebService";
ISurveyServicesurveyService=(ISurveyService)JaxWsProxyFactoryBeanImpl.getProxyFactoryBean(ISurveyService.class,address);

//1、定义调查投票的变量与内容,用来发送给服务
Stringusername="Test";
intpoint=88;
//调用方法进行服务消费
Stringresult=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);
}

publicJaxWsProxyFactoryBeangetIdentityValidateServiceClientFactory(){
returnidentityValidateServiceClientFactory;
}

publicvoidsetIdentityValidateServiceClientFactory(
JaxWsProxyFactoryBeanidentityValidateServiceClientFactory){
this.identityValidateServiceClientFactory=identityValidateServiceClientFactory;
}
}
直接运行以上客户端消费程序,一共调用了三次WebService,并得到结果如下:
Result:谢谢您的投票!您的投票分数通过审核!
Result:您不能重复进行投票!
Result:谢谢您的投票!您的投票分数太低!
于是服务正常地得到了调用,并且能够正确地返回结果,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: