[1]CXF3.1整合Spring开发webservice——helloworld篇
Spring版本3.2.10
CXF版本3.1.1
项目采用MAVEN组织依赖jar
我这里是有parent的pom,为了简洁明了,我直接把所有的依赖都列一起了,所以都没version,反正上面已经写了版本
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>ws-test</artifactId> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.ws.xmlschema</groupId> <artifactId>xmlschema-core</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.0.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://127.0.0.1:8080/manager</url> <server>tomcat7</server> <username>admin</username> <password>admin</password> <port>8080</port> <path>/ws</path> <charset>utf-8</charset> </configuration> </plugin> </plugins> </build> </project>
关于jar需要注意的是:spring使用的是xmlschema,而cxf使用的是xmlschema-core,因此最好显式地写在pom里面,否则会抛异常:java.lang.NoSuchMethodError:org.apache.ws.commons.schema.XmlSchemaCollection.read
另外,在最开始的配置过程中,遇到了unsupportedmajor.minorversion51.0的异常,也是之前没有遇到过的,后来查了一下发现一般都是因为jdk版本的问题,最后在apachecxf的官网上找到了答案:
ThecurrentplanisthatCXF3.1willnolongersupportJava6andwillrequireJava7ornewer.UsersarestronglyencouragedtostartmovingtoJava7.
好嘛,习惯1.6了……统统升级到1.7吧
保存pom,maven开始工作,duangduang开始向中央仓库拉各种文件,这个时间可以开始创建java类
//接口 @WebService public interface IHelloWorldService { public void hello(String name); }
//实现类 @WebService(endpointInterface="com.myproject.soa.cxf.IHelloWorldService")//endpointInterface是为了在实现多个接口情况下指明webservice的接口 @Component//这个是spring的注解 public class HelloWorldService implements IHelloWorldService { @Override public void hello(String name) { System.out.println("hello "+name); } }
接下来再配置spring
applicationContext-core.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <context:annotation-config /> <context:component-scan base-package="com.myproject" /> </beans>
applicationContext-webservice.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-3.2.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" /> <!--<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> cxf 3以上的版本这条配置都去掉了--> <jaxws:endpoint id="helloworld" implementor="#helloWorldService" address="/helloworld" /> </beans>
- implementor="#helloWorldService"的写法是使用spring托管的bean的名字,当然也可以写类名,不过太多字懒得敲,毕竟都和spring搞基了,就用spring的方式
- address是最后访问的路径
最后是web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <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> <!-- 配置CXF框架的核心Servlet --> <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>/*</url-pattern> </servlet-mapping> </web-app>
完成!
运行mvntomcat7:run
信息: Setting the server's publish address to be /helloword 六月 25, 2015 4:49:18 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-bio-8080"]
这时就可以访问http://localhost:8080/ws/helloworld?wsdl,正常的话可以看到一串xml,说明服务端已经完成