[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,说明服务端已经完成

相关推荐