这个是参照官方的一个例子,自己练习的,官方的地址:http://cxf.apache.org/docs/writing-a-service-with-spring.html
最近使用Maven新建Web项目和之前的有点儿不一样,不知道为什么,好在能用。以后应该会在Maven的Web项目的基础上学习CXF。
1.pom.xml
首先,是pom.xml,添加项目需要的依赖包,这是根据官方的例子整理出来的
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.deppon.demo.ws</groupId> <artifactId>cxf-demo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>cxf-demo Maven Webapp</name> <url>http://maven.apache.org</url> <!-- 属性配置 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.5</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.7.5</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>2.7.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-webapp</artifactId> <version>8.1.11.v20130520</version> </dependency> </dependencies> <build> <finalName>cxf-demo</finalName> </build> </project>
2.写一个接口,和一个实现类
我们写一个简单的例子
接口:
package com.deppon.demo.ws.service; import javax.jws.WebParam; import javax.jws.WebService; /** * 注意,这里的方法好像不能重载 * 从网上查,说是CXF不支持方法的重载发布 * * @author yuguiyang * */ @WebService public interface IHelloWorld { public String say(); /** * 这里加上了注解@WebParam,注明参数的名称,如果不加的话, * 默认使用arg0......代替,不符合命名规范 * @param name * @return */ public String sayWithName(@WebParam(name="name")String name); }
实现类:
package com.deppon.demo.ws.service.impl; import javax.jws.WebService; import com.deppon.demo.ws.service.IHelloWorld; /** * 这里注明的是,接口的(包名+接口名) * @author yuguiyang * */ @WebService(endpointInterface = "com.deppon.demo.ws.service.IHelloWorld") public class HelloWorld implements IHelloWorld { @Override public String say() { System.out.println("-------from say()."); return "Hello World !"; } @Override public String sayWithName(String name) { System.out.println("---------from say(String)."); return "你好," + name; } }
3.添加Spring支持
@H_404[email protected]<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-servlet.xml" /> <jaxws:endpoint id="helloWorld" implementor="com.deppon.demo.ws.service.impl.HelloWorld" address="/HelloWorld" /> </beans>@H_404[email protected]
这里添加了Spring的监听器和CXF的Servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-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>/services/*</url-pattern> </servlet-mapping> </web-app>
4.部署项目
到这里,我们就可以部署项目,看一下了
记得上面,配置的CXF的URL,我们访问一下,看看
这里显示的就是,有效地服务
左侧,是我们的服务的两个方法
右侧,显示的是我们服务的信息
1.Endpoint address,即端口地址,还记得在applicationContext.xml中我们配置服务时
<jaxws:endpoint id="helloWorld" implementor="com.deppon.demo.ws.service.impl.HelloWorld" address="/HelloWorld" />就是这里的address,加上了项目的地址和CXFServlet的URL,为了验证,我们改一下试试:
<servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/demos/*</url-pattern> </servlet-mapping>
<jaxws:endpoint id="helloWorld" implementor="com.deppon.demo.ws.service.impl.HelloWorld" address="/demo01" />重新部署项目之后:
可以看到,端口地址就变了,
PS:注意,为了保持一致,我又改了回去。
2.现在,看右侧的WSDL:是一个链接,我们点一下,会出现这样的页面:
3.还记得我们在写接口的时候,使用了注解@WebParam吗,从哪里可以看到呢?
看上面的文件的第二行:
<wsdl:import location="http://localhost:8080/cxf-demo/services/HelloWorld?wsdl=IHelloWorld.wsdl" namespace="http://service.ws.demo.deppon.com/"> </wsdl:import>
我们复制一下location,访问以下,会是这样的:
看上面标注的地方,就是这里了。可以试着,不写注解WebParam或者修改问其他的名字试试。
5.测试
测试的话,也是根据官方的例子,写的
@H_404[email protected]clientFactory是CXF提供的一个类,他需要2个参数,一个是服务接口的地址,一个是服务的端口地址
<?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.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd"> <bean id="client" class="com.deppon.demo.ws.service.IHelloWorld" factory-bean="clientFactory" factory-method="create"/> <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyfactorybean"> <property name="serviceClass" value="com.deppon.demo.ws.service.IHelloWorld"/> <property name="address" value="http://localhost:8080/cxf-demo/services/HelloWorld"/> </bean> </beans>@H_404[email protected]
package com.deppon.demo.ws.client; import org.junit.Test; import org.springframework.context.support.ClasspathXmlApplicationContext; import com.deppon.demo.ws.service.IHelloWorld; public class Client { @Test public void test() { ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[] { "client-beans.xml" }); IHelloWorld client = (IHelloWorld) context.getBean("client"); String response = client.say(); System.out.println("Response: " + response); response = client.sayWithName("路飞"); System.out.println("Response: " + response); } }
服务器端,也会有输出:
到这里,我们的第一个例子就写完了。
项目的整理结构如图:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。