`
MauerSu
  • 浏览: 513837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用cxf发布和调用web service

 
阅读更多
源:http://kyfxbl.iteye.com/blog/1432920
评:
--------
jar包依赖

<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.3.7</version>
</dependency>
<!-- cxf 依赖 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-common</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-core</artifactId>
<version>2.6.1</version>
</dependency>

-------

Spring MVC是通过DispatcherServlet来加载Spring配置文件的,因此不需要在web.xml中配置ContextLoaderListener。但是CXF却需要通过ContextLoaderListener来加载Spring。

这样就产生了一个矛盾,如果不配置ContextLoaderListener,CXF就无法正常使用。但如果配置ContextLoaderListener,又会造成Spring的重复加载(DispatcherServlet一次,ContextLoaderListener一次)

在网上查了一下资料,只看到一个国外的程序员提出不配置ContextLoaderListener,通过写一个CXFController,来替代默认的CXFServlet。但是这种HACK的方式总是不太好

所以我采用一种折中的方式,来解决Spring MVC和cxf并存的问题。但是也不是很优雅,希望有人能给出更好的办法

首先是web.xml的配置
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" 
        id="MyFramework" version="3.0"> 
         
        <display-name>MyFramework</display-name> 
         
        <context-param> 
            <param-name>contextConfigLocation</param-name> 
            <param-value>  
                WEB-INF/beans.xml,  
                WEB-INF/cxf.xml 
            </param-value>  
        </context-param> 
         
        <listener>   
            <listener-class>   
                org.springframework.web.context.ContextLoaderListener   
            </listener-class>   
        </listener>   
         
        <servlet> 
            <servlet-name>framework</servlet-name> 
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
            <init-param>   
                <param-name>contextConfigLocation</param-name>   
                <param-value>WEB-INF/spring-mvc.xml</param-value>   
            </init-param>   
            <load-on-startup>1</load-on-startup> 
        </servlet> 
     
        <servlet-mapping> 
            <servlet-name>framework</servlet-name> 
            <url-pattern>/</url-pattern> 
        </servlet-mapping> 
         
        <servlet>   
            <servlet-name>CXFServlet</servlet-name>   
            <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>   
            <load-on-startup>2</load-on-startup>   
        </servlet>   
       
        <servlet-mapping>   
            <servlet-name>CXFServlet</servlet-name>   
            <url-pattern>/webservice/*</url-pattern>   
        </servlet-mapping>   
         
    </web-app> 


在ContextLoaderListener里面,加载cxf和spring的公共配置信息。然后在DispatcherServlet中加载spring mvc所需的信息。利用Spring配置文件拆分的方式,既实现spring mvc和cxf的共存,又避免spring配置信息的重复加载

然后是公共的配置信息,beans.xml
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:tx="http://www.springframework.org/schema/tx" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                                http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
                                http://www.springframework.org/schema/context  
                                http://www.springframework.org/schema/context/spring-context-3.1.xsd 
                                http://www.springframework.org/schema/tx 
                                http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 
     
        <context:component-scan base-package="com.huawei.framework" /> 
     
        <bean id="propertyConfigurer" 
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
            <property name="locations"> 
                <list> 
                    <value>classpath:jdbc.properties</value> 
                </list> 
            </property> 
        </bean> 
     
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
            <property name="driverClass" value="${jdbc.driver}" /> 
            <property name="jdbcUrl" value="${jdbc.url}" /> 
            <property name="user" value="${jdbc.username}" /> 
            <property name="password" value="${jdbc.password}" /> 
            <property name="minPoolSize" value="10" /> 
            <property name="maxPoolSize" value="50" /> 
        </bean> 
     
        <bean id="sessionFactory" 
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
            <property name="dataSource" ref="dataSource" /> 
            <property name="mappingLocations" 
                value="classpath:/com/huawei/framework/model/**/*.hbm.xml" /> 
            <property name="hibernateProperties"> 
                <props> 
                    <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
                    <prop key="hibernate.show_sql">true</prop> 
                    <prop key="hibernate.format_sql">true</prop> 
                    <prop key="hibernate.jdbc.fetch_size">50</prop> 
                    <prop key="hibernate.jdbc.batch_size">25</prop> 
                    <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop> 
                </props> 
            </property> 
        </bean> 
     
        <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
            <property name="sessionFactory" ref="sessionFactory" /> 
            <property name="fetchSize" value="10" /> 
        </bean> 
     
        <bean id="transactionManager" 
            class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
            <property name="sessionFactory" ref="sessionFactory" /> 
        </bean> 
     
        <tx:annotation-driven transaction-manager="transactionManager" /> 
     
    </beans> 


然后是cxf所需的信息,cxf.xml
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.1.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" 
            implementorClass="com.huawei.framework.webservice.HelloWorldImpl" 
            address="/HelloWorld" /> 
     
    </beans> 


最后是spring mvc所需的信息,spring-mvc.xml
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:p="http://www.springframework.org/schema/p" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:mvc="http://www.springframework.org/schema/mvc"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                                http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
                                http://www.springframework.org/schema/context  
                                http://www.springframework.org/schema/context/spring-context-3.1.xsd 
                                http://www.springframework.org/schema/mvc 
                                http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 
     
        <context:component-scan base-package="com.huawei.framework" /> 
     
        <mvc:annotation-driven /> 
     
        <mvc:default-servlet-handler /> 
     
        <bean 
            class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
            p:prefix="/WEB-INF/view/" p:suffix=".jsp" 
            p:viewClass="org.springframework.web.servlet.view.JstlView" /> 
     
    </beans> 


这顺便还带来一个附带的好处,即进行单元测试的时候,可以仅加载必须的类,比如做DAO组件的单元测试,就不需要加载spring-mvc.xml和cxf.xml了
Java代码  收藏代码

    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations = { "file:WebContent/WEB-INF/beans.xml" }) 
    public class UserDaoHibernateTest { 
     
        @Autowired 
        private UserDao dao; 
     
        private static String ID; 
     
        @Test 
        public void testInsert() { 
            User user = new User(); 
            user.setName("fme001"); 
            user.setAge(23); 
            dao.insert(user); 
        } 
     
        @Test 
        public void testQueryByName() { 
            String name = "fme001"; 
            User user = dao.queryByName(name); 
            assertEquals(23, user.getAge()); 
            ID = user.getId(); 
        } 
     
        @Test 
        public void testQueryByAge() { 
            int age = 23; 
            List<User> result = dao.queryByAge(age); 
            assertEquals(1, result.size()); 
        } 
     
        @Test 
        public void testQueryAll() { 
            List<User> result = dao.queryAll(); 
            assertEquals(1, result.size()); 
        } 
     
        @Test 
        public void testQuery() { 
            User user = dao.query(ID); 
            assertEquals(23, user.getAge()); 
            assertEquals("fme001", user.getName()); 
        } 
     
        @Test 
        public void testUpdate() { 
            User user = dao.query(ID); 
            user.setAge(24); 
            dao.update(user); 
            user = dao.query(ID); 
            assertEquals(24, user.getAge()); 
        } 
     
        @Test 
        public void testDelete() { 
            User user = dao.query(ID); 
            dao.delete(user); 
        } 
     
    } 


可以看到,集成cxf和spring mvc确实不算很方便,需要绕一绕。上述方法只是一个折中的方案,希望新版本的cxf可以提供一个CXFController,这样的话就可以统一用DispatcherServlet来加载Spring,不配置ContextLoaderListener。这样的话web.xml可以简洁很多。或者如果哪位网友有更好的方式,请指教一下
分享到:
评论

相关推荐

    Springboot整合CXF发布Web service和客户端调用(用户和密码验证)

    本教程将详细介绍如何利用Spring Boot与CXF进行集成,以发布Web服务并实现用户和密码验证的客户端调用。 首先,我们需要在Spring Boot项目中引入CXF的依赖。这通常通过在`pom.xml`文件中添加对应的Maven依赖来完成...

    使用CXF发布和调用接口(星座运势接口)

    解压后,你可以通过构建工具(如Maven或Gradle)构建并运行项目,体验CXF发布和调用Web服务的过程。 总结,Apache CXF是一个强大的工具,可以帮助我们轻松地开发和使用Web服务。在这个星座运势接口的例子中,我们...

    springboot整合CXF发布webservice和客户端调用

    通过这个项目,开发者不仅可以了解SpringBoot和CXF的基本概念,还能掌握两者如何协同工作,发布和调用Web服务。同时,对于SpringBoot应用的打包、部署和测试也有了一定的认识。这个例子是一个理想的实践项目,对于...

    使用CXF和camel-cxf调用webservice

    本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...

    cxf客户端调用axis服务端流程

    在Java开发中,CXF和Axis是两种广泛使用的Web服务框架。CXF主要用来创建和消费SOAP和RESTful Web服务,而Axis则是Apache组织早期推出的一款Web服务框架,主要用于SOAP服务。本文将深入探讨如何使用CXF客户端调用Axis...

    CXF 框架实战代码--服务器端CXF接口发布与调用

    在本实战教程中,我们将深入探讨如何在服务器端使用CXF来发布和调用Web服务接口。 ### 1. CXF框架基础 CXF的核心在于其强大的服务引擎,它允许开发者以Java编程模型来定义服务接口,并自动生成相应的服务实现和...

    Apache CXF Web Service Development(源码)

    这通常包括了创建服务接口、实现服务逻辑、配置服务端点、以及发布和调用服务等步骤。源码部分可能包含了示例项目或者完整的框架源代码,用于帮助开发者深入理解其工作原理和内部机制。 【描述】中的"源码"提示我们...

    使用CXF发布和调用webservice之HelloWorld入门

    ### 使用CXF发布和调用WebService之HelloWorld入门详解 #### 一、概述 本文将详细介绍如何使用Apache CXF框架来实现一个简单的WebService——HelloWorld示例。此示例不仅适用于初学者理解WebService的基本概念,...

    CXF开发Web Service实例demo

    2. **动态客户端**:如果WSDL在运行时可用,你可以使用CXF的DynamicClientFactory创建一个动态客户端,它可以在运行时动态地调用Web Service操作。 3. **SOAP UI测试**:在开发过程中,SOAP UI工具是一个很好的测试...

    Spring CXF Mybatis 发布 Web Service 实例

    综上所述,Spring、CXF和Mybatis的结合使用,使得我们可以方便地发布和管理Web服务,同时利用Mybatis的强大数据库操作能力,实现了高效的数据访问。这种组合在实际项目中被广泛应用,具有很高的灵活性和可扩展性。...

    CXF 整合 Spring 搭建Web Service

    - **客户端调用**:Spring可以帮助创建CXF的客户端代理,通过`JaxWsProxyFactoryBean`创建服务代理,方便调用Web服务。 4. **使用CXF的Spring支持**: - `cxf-servlet.xml`配置:在Spring配置文件中,设置CXF的...

    Spring MVC、CXF、Web Service

    通过深入研究这个压缩包内的文件,你可以了解到如何在Spring MVC环境中配置和使用CXF来创建和调用Web Service,以及如何处理相关的请求和响应。这将是一个宝贵的学习资源,有助于提升你在企业级Java开发中的技能。

    Java webservice cxf客户端调用demo和服务端

    2. 创建服务代理实例:通过代理类,客户端可以创建服务的实例,就像调用本地对象一样调用Web服务方法。 3. 参数传递与调用:设置方法参数并执行服务调用,CXF会处理底层的SOAP消息交换。 4. 处理响应:获取服务返回...

    JAVA 调用Web Service的方法

    总的来说,Java调用Web Service涉及到多个环节,从理解协议和标准,到选择合适的工具和框架,再到实际的编码和测试,每个步骤都需要开发者具备扎实的理论基础和实践经验。通过以上知识点的学习和实践,你将能够熟练...

    CXF框架应用在Web项目中

    Ⅲ)使用EndPoint类的静态方法publish()来发布web service。 2、客户端 Ⅰ)调用CXF提供的wsdl2java工具,根据WSDL文档生成相应的Java代码(任何语言实现web service都要暴露WSDL文档); Ⅱ)找到wsdl2java所...

    CXF Spring Web Service 程序

    在Java世界中,Apache CXF是一个广泛使用的开源框架,用于构建和部署Web服务。它提供了丰富的功能,包括SOAP、RESTful API的支持,以及与Spring框架的深度集成。本篇文章将深入探讨CXF与Spring的结合,以及如何创建...

    Apache CXF开发Web Service 开发Web Service之Kick Start

    6. 最后,编写客户端代码,使用生成的代理类调用Web服务。 总的来说,Apache CXF为Web服务开发提供了强大的支持,结合Maven和Eclipse,可以极大地提高开发效率。通过学习和实践,你可以深入了解Web服务的原理,并...

Global site tag (gtag.js) - Google Analytics