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

cxf集成spring,精简版

 
阅读更多
源:http://kyfxbl.iteye.com/blog/1633162
webservice   http://kyfxbl.iteye.com/category/213780
评:
上次总结了spring集成cxf的方法,不过有些地方说得不清楚:http://kyfxbl.iteye.com/category/213780

上次把web service客户端接口,用注解注入到别的bean里,结果报错了。当时一直没有找到原因,现在回想,有可能是当时代码环境的问题,spring和cxf的配置都有些混乱

最近在搭建一个培训的框架,开发环境很纯净,上次那个问题没有再发生了。因此也简化了一下,重新总结一下。不过由于上次那个问题,最终也没找到原因,所以不敢保证这次也一定是正确的,只能说,在以下环境是OK的:

tomcat7.0.29
spring-framework-3.1.0
cxf-2.6.1
neethi-3.0.2
wsdl4j-1.6.2
xmlschema-core-2.0.2

本文介绍的是从代码到wsdl文件的写法,如果是从wsdl到代码,可以看另一篇博客:http://kyfxbl.iteye.com/blog/1481330

首先是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"  
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
        id="WebApp_ID" version="3.0"> 
       
        <display-name>DevelopFramework</display-name> 
       
        <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>   
            <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>/webservice/*</url-pattern>   
        </servlet-mapping> 
           
    </web-app> 


这里因为没有集成spring-mvc,所以web.xml就很简单

然后是spring的配置文件
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: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://www.springframework.org/schema/context 
                                http://www.springframework.org/schema/context/spring-context-3.1.xsd 
                                http://cxf.apache.org/jaxws  
                                http://cxf.apache.org/schemas/jaxws.xsd"> 
         
        <import resource="classpath:META-INF/cxf/cxf.xml" /> 
         
        <context:component-scan base-package="com.huawei.inoc.framework" /> 
             
        <jaxws:endpoint id="helloWorld" implementor="#helloWorldWebserviceImpl" address="/HelloWorld" /> 
         
        <jaxws:client id="client"   
            serviceClass="com.huawei.inoc.dummy.webservice.IDemoSupport"   
            address="http://localhost:8080/Dummy/webservice/getDate" />   
         
    </beans> 


这里是简化后的配置,仅包含必要的配置信息

这里分别配置了一个web service的客户端,和一个web service的服务端

这里要注意的是,jaxws:endpoint里的implementor,不能直接写xxx.xxx.ClassName,因为这里的实现类,自身也是一个bean,如果直接写的话,里面的依赖关系就没有了,要用#beanName的语法

jaxws:client里的serviceClass,写的是接口的完整类名,address是目标endpoint的地址

接下来是要发布的webservice接口代码
Java代码  收藏代码

    @WebService 
    public interface HelloWorldWebservice { 
     
        String sayHello(String name); 
     
    } 


就是一个普通的接口声明,只是要加上@WebService注解

最后是webservice实现类代码
Java代码  收藏代码

    @Controller 
    public class HelloWorldWebserviceImpl implements HelloWorldWebservice { 
     
        @Autowired 
        private ITestService service; 
     
        @Autowired 
        private IDemoSupport support; 
     
        @Override 
        public String sayHello(String name) { 
            service.doSomething(); 
            System.out.println(support.getDate()); 
            return "hello " + name; 
        } 
     
    } 


实现类更加简单,只需要继承刚才声明的接口就可以了,不需要额外的注解

这里用到了@Controller和@Autowired注解,只是为了演示把实现类自身声明为spring bean,并把下层的业务bean,和webservice client的bean注入进来

启动tomcat后,webservice就发布成功了,并且ITestService和IDemoSupport都是注入成功的

[点击查看原始大小图片]

用soapui调用一下,控制台打出如下信息:
doSomething()
Wed Aug 15 17:12:50 CST 2012

说明此时业务bean和client bean都是注入成功的。上次死活就不行,估计确实是代码环境的原因,现在也没法还原现场了,成为悬案

另外写了一个Servlet,看看当前的ApplicationContext里究竟注册了哪些bean
Java代码  收藏代码

    protected void doGet(HttpServletRequest request, 
                HttpServletResponse response) throws ServletException, IOException { 
     
            ApplicationContext context = WebApplicationContextUtils 
                    .getWebApplicationContext(request.getServletContext()); 
     
            String[] beanNames = context.getBeanDefinitionNames(); 
     
            for (String beanName : beanNames) { 
                System.out.println(beanName); 
            } 
     
        } 


执行之后,控制台打出bean信息:

cxf
org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor
org.apache.cxf.bus.spring.Jsr250BeanPostProcessor
org.apache.cxf.bus.spring.BusExtensionPostProcessor
testService
helloWorldWebserviceImpl
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
propertyConfigurer
dataSource
sessionFactory
helloWorld
client.proxyFactory
client
org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0

前4个都是cxf.xml里注册的

testService是业务bean

helloWorldWebserviceImpl是webservice实现类的bean,注意这个只是一个普通的spring bean,还没有被发布为web service,下面的helloWorld才是

helloWorld,就是<jaxws:endpoint>那行生成的bean,实际的web service

client,是<jaxws:client>那行生成的bean。这个类是cxf生成的代理类,但是实现了web service服务端接口。代码不可见,但是可以像普通的spring bean一样注入到别的bean里
Java代码  收藏代码

    Object clientProxyFactory = context.getBean("client"); 
            System.out 
                    .println("client: " + clientProxyFactory.getClass().getName()); 
            System.out.println(clientProxyFactory instanceof IDemoSupport); 


执行以后,输出是:
client: $Proxy42
true
如果跟进去调试,可以看得更清楚一点:



client.proxyFactory应该是cxf生成的一个内部bean,bean definition是abstract的,如果尝试用getBean()方法获取,会抛出异常
Java代码  收藏代码

    Object clientProxyFactory = context.getBean("client.proxyFactory"); 



org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name 'client.proxyFactory': Bean definition is abstract
分享到:
评论

相关推荐

    cxf集成spring

    通过提供的"**cxf集成spring_jar**"压缩包,你可以直接获取到精简版的CXF和Spring库,省去了自行下载和管理依赖的步骤,从而更快速地搭建和运行集成环境。请注意,实际使用时应根据项目的具体需求,适当调整配置和...

    cxf最精简jar包

    在“cxf-lib最精简版”压缩包中,应该包含了上述提到的关键组件,使得用户能够在不依赖大型CXF发行版的情况下,快速搭建和运行一个简单的服务端和客户端应用。然而,实际项目中,根据具体需求可能会需要更多的依赖,...

    cxf最少依赖jar包

    【CXF最少依赖JAR包】是针对Apache CXF框架的一种精简打包方式,旨在减少项目中的依赖体积,提高项目的加载速度和管理效率。Apache CXF是一个开源的、基于Java的Web服务框架,它允许开发者创建和消费各种类型的Web...

    家庭支出与收入数据数据集,根据人口统计和地理指标进行了分类,加拿大为例,适用于数据分析、机器学习

    这个数据集提供了2010年至2021年间加拿大各省的家庭支出与收入数据,这些数据根据人口统计和地理指标进行了分类。每行代表了年份(REF_DATE)、省份(GEO)以及编码后的支出或收入类型的唯一组合(COORDINATE)。以下是该数据集的关键特点及包含的列信息: 关键特点: 支出数据:家庭支出按照收入五分位数和支出类别进行分类。 收入数据:家庭收入值根据家庭类型、较年长成年人的年龄组别和收入水平细分。 地理位置匿名化:为了保护隐私,原始的地理位置标识符被替换为如“Province 1”这样的标签。 时间序列:涵盖了超过十年的财务数据(2010–2021),适合用于纵向经济和社会趋势分析。 包含的列: REF_DATE:记录年份(2010–2021) GEO:省份标签(例如,“Province 1”) Statistic:度量类型(例如,平均家庭支出) Before-tax household income quintile:税前家庭收入水平分组 Household expenditures, summary-level categories:支出类别 UOM:计量单位 COORD

    【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Matlab完整源码和数据)

    1.【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Matlab完整源码和数据) 2.数据集:NASA数据集,已经处理好,B0005电池训练、测试; 3.环境准备:Matlab2023b,可读性强; 4.模型描述:GRU门控循环单元在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了GRU门控循环单元在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。

    【更新至2024年】2000-2024年各省专利侵权案件结案数数据

    2000-2024年各省专利侵权案件结案数数据 1、时间:2000-2024年 2、来源:国家知识产权J 3、指标:专利侵权案件结案数 4、范围:31省 5、用途:可用于衡量知识产权保护水平

    HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式

    - 使用`<div>` 容器组织游戏界面,包含得分显示、游戏画布和操作按钮 - 支持三种游戏模式选择(一般模式、困难模式、无敌模式) - 移动端和桌面端兼容,提供触摸和键盘两种控制方式 2. CSS样式 : - 采用Flex布局实现页面居中显示 - 使用Grid布局实现方向按钮的排列 - 定义了游戏容器的阴影、圆角等视觉效果 - 为按钮添加了hover效果和过渡动画 3. JavaScript逻辑 : - 使用Canvas API实现游戏渲染 - 实现了蛇的移动、食物生成、碰撞检测等核心游戏逻辑 - 支持三种游戏模式,不同模式对应不同的游戏速度和规则 - 使用localStorage保存最高分记录 - 实现随机颜色生成,使游戏更具趣味性 代码整体结构清晰,功能完整,具有良好的可扩展性和可维护性。

    附件2-5:台区智能融合终端入网专业检测送检样品主要元器件清单.docx

    台区终端电科院送检文档

    基于强化学习的飞机升阻力特性预测模型实现及应用(含详细可运行代码及解释)

    内容概要:本文详细介绍了一个基于强化学习(RL)的飞机升阻力特性预测模型的实现过程。首先,定义了飞机空气动力学环境,包括状态空间、动作空间以及目标——预测升力系数(Cl)和阻力系数(Cd)。接着,通过生成模拟数据并进行预处理,创建了用于训练的数据集。然后,构建了一个神经网络代理模型,用于联合编码状态和动作,并预测升阻力系数。最后,实现了PPO算法来训练强化学习代理,使其能够根据当前状态选择最优动作,并通过不断迭代提高预测精度。文中还提供了完整的代码实现和详细的注释。 适合人群:航空航天领域的研究人员、机器学习工程师、对强化学习感兴趣的开发者。 使用场景及目标:适用于需要预测飞机升阻力特性的应用场景,如飞行器设计优化、性能评估等。目标是通过强化学习方法提升预测模型的准确性,从而为实际工程提供可靠的理论支持和技术手段。 其他说明:本文不仅涵盖了模型的设计与实现,还包括了数据生成、预处理等多个环节,有助于读者全面理解整个建模过程。同时,提供的代码可以作为研究和开发的基础,方便进一步扩展和改进。

    cmock ut aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    cmock ut aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    lsm6d datasheet

    lsm6d datasheet

    风力发电机传动机构的设计(增速器).rar

    风力发电机传动机构的设计(增速器)

    genesys-zu(5ev)配置petalinux(从安装到嵌入)

    genesys-zu(5ev)配置petalinux(从安装到嵌入)

    django自建博客app

    django自建博客app

    基于android平台的学生选课系统的设计与实现.zip

    Android项目原生java语言课程设计,包含LW+ppt

    幼儿园预防肺结核教育培训课件资料.pptx

    幼儿园预防肺结核教育培训课件资料

    STM32F103RCT6单片机控制气泵和电磁阀的开关,气泵和电磁阀的开和关均为开关量,使用mos管控制,mos管选择主要注意两个参数即可,一是导通的电流,二是耐压值,并且常用NMOS管

    STM32F103RCT6单片机控制气泵和电磁阀的开关 1、气泵和电磁阀的开和关均为开关量,实现控制方法有多种,比如继电器,但是继电器动作有噪声且体积较大,更好的方法为使用mos管。 2、mos管的选型:mos管选择主要注意两个参数即可,一是导通的电流,二是耐压值,并且常用NMOS管,根据要求,气泵和电磁阀供电电压为12V,所以选择的mos管耐压值要大于12V,这里选用耐压值为30V的MOS管,并且导通电流为5.8A。

    面板数据-全国各省金融监管强度数据集-含处理代码(2009-2023年).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/146916073

    将 Windows 系统中 “C:\windows\fonts” 目录下的所有字体文件

    将 Windows 系统中 “C:\windows\fonts” 目录下的所有字体文件

    计量自动化终端技术规范 第2-5部分:智能量测终端功能模组接口协议(2023年6月).pdf

    智能量测终端最新标准

Global site tag (gtag.js) - Google Analytics