1. 为CXF设置编译和开发环境
打开eclipse(其他的IDE也可以),引入如下的类库(也可以省事一点,把CXF/lib路径下的所有类库都引入)
commons-logging-1.1.jar
geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
geronimo-ws-metadata_2.0_spec- 1.1.1 .jar (JSR 181)
jaxb-api-2.0.jar
jaxb-impl- 2.0.5 .jar
jaxws-api-2.0.jar
neethi-2.0.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
stax-api- 1.0.1 .jar
wsdl4j- 1.6.1 .jar
wstx-asl- 3.2.1 .jar
XmlSchema-1.2.jar
xml-resolver-1.2.jar
引入Spring相关的jars (只对):
aopalliance-1.0.jar
spring-core- 2.0.4 .jar
spring-beans- 2.0.4 .jar
spring-context- 2.0.4 .jar
spring-web- 2.0.4 .jar
引入CXF相关的jar:
cxf-2.0-incubator.jar
2. 编写自己的服务
在eclipse里创建一个J2EE的动态Web项目
这里所有的例子代码都在 “D:/cxf/samples/java_first_spring_support”路径下。“d:/cxf”是CXF的安装路径。但是在这个路径下不包含Web Service的例子源代码(怀疑是开发人员忘记了),需要手工在项目中生成。
首先写一个服务接口,例子中的HelloWorld.java。我们要注意的是这个例子使用了JSR181规范中的声明“@WebService”。
package demo.spring;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String text);
}
下一步实现这个服务接口,例子中的HelloWorldImpl.java。这个例子代码中的“@WebService”标签只包含一个endpointInterface的属性,这个属性让CXF知道根据哪个接口生成WSDL文件。这里有点和我们第一个例子不同,没有包含ServiceName属性。这是因为这个属性会在Spring的配置文件中声明,请参考下面的beans.xml这个配置文件。
package demo.spring;
import javax.jws.WebService;
@WebService(endpointInterface = "demo.hw.server.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
public String sayHi(String text) {
return "Hello " + text;
}
}
3. 在Spring中声明你的服务Beans
CXF中包含对Spring2.0很好的支持。对于JAX-WS这一类配置,我们有<jaxws:endpoint>bean作为服务端节点的配置说明。
让我们创建一个”beans.xml”文件在我们项目的WEB-INF路径下,注意这个文件的例子可以在“D:/cxf/samples/java_first_spring_support/”中找到。
<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.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<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" />
<jaxws:endpoint
id="helloWorld"
implementor="demo.spring.HelloWorldImpl"
address="/HelloWorld" />
</beans>
这里我们可以看到<jaxws:endpoint>的三个属性id, implementor和address。
“id”指定这个Bean在Spring上下文中唯一的标识。
“implementor”指定了这个Web Service的实现类。
“address”指定了服务在Web服务器上发布的地址。这个地址可以包含ip和端口的完整地址,也可以是只包含相对路径的地址。
1. 配置你的Servlet
配置的过程中我们需要在web.xml中添加如下两项:
第一个是Spring的ContextLoaderListerp类会在启动时加载上面配置beans.xml文件。我们需要设定context-param节点;第二个是增加一个CXF Servlet。配置文件如下,注意这个文件可以在“D:/cxf/samples/java_first_spring_support/”中找到。
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
这里需要注意的是你配置的endpoint的地址(address)属性必须和你在Beans.xml中定义的一致。尽管在我们的例子中没有在HelloWorldImpl.java中声明“address“属性,我们也需要在实际的配置中有所注意。
2. CXF引入了一个JaxWsProxyFactory bean,他可以根据服务接口创建一个客户端程序。你只需要告诉服务类是什么(这个例子中是HelloWorld interface这个类)和服务的URL就可以了。你可以通过JaxWsProxyFactory的create方法来生成一个客户端的bean。
下面是配置bean的例子
<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/schema/jaxws.xsd">
<bean id="client" class="demo.spring.HelloWorld"
factory-bean="clientFactory" factory-method="create"/>
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="demo.spring.HelloWorld"/>
<property name="address" value="http://localhost:9002/HelloWorld"/>
</bean>
</beans>
如果你在客户端代码要使用这个bean,代码会非常简单,例子如下
ApplicationContext context = ...; // your Spring ApplicationContext
HellWorld client = (HelloWorld) context.getBean("client");
客户端的例子代码Client.java和配置文件例子client-beans.xml都可以在“D:/cxf/samples/java_first_spring_support/src/demo/spring/client“中找到。
例子的运行,我们可以通过两种方式来运行我们完成的例子。
一. 利用ant来直接运行CXF安装路径下的samples。方法可以参考D:/cxf/samples/ReadMe.txt文件。
a) 首先在“D:/cxf/samples”创建了一个”setenv.cmd”文件,文件内容如下:
set CXF_HOME=d:/cxf
set JAVA_HOME=C:/Program Files/Java/jdk 1.5.0 _13
set ANT_HOME=d:/apache/ant
set PATH=%JAVA_HOME%/bin;%ANT_HOME%/bin;%CXF_HOME%/bin;%PATH%
set CLASSPATH=.;%CXF_HOME%/lib/cxf-manifest-incubator.jar;./build/classes
这个执行文件配置了运行CXF例子所需的环境变量。
b) 开始->运行,敲入“cmd”,进入dos命令输入界面,进入CXF的spring例子的路径“D:/cxf/samples” 运行我们在上一步创建的“setenv.cmd”,
c) 进入“D:/cxf/samples/java_first_spring_support”,编译服务的代码。运行“ant”
d) 启动服务器“ant server”
e) 开始->运行,敲入“cmd”,进入dos命令输入界面,进入CXF的spring例子的路径“D:/cxf/samples” 运行我们在上一步创建的“setenv.cmd”,
f) 启动客户端“ant client”
把我们上面
eclipse
中开发的
Web
项目打包为
war
包的形式。部署到
tomcat
或者
jetty
服务器上。注意部署时访问的路径。比如我部署在
Tomcat
上,访问的路径就是:
http://localhost:8080/CXFSpring/HelloWorld