zoukankan      html  css  js  c++  java
  • cxf快速简单的实现webservice调用

    webservice的历史和相关技术

    参考:http://www.cnblogs.com/doosmile/archive/2012/06/21/2557351.html

    webservice技术现在已经非常成熟,大浪淘沙后,目前java开发webservice的框架主要包括axis2和cxf。 

    axis2和cxf都是apache旗下的产品,但是其目的不同,导致webservice开发方法也不一样。两个框架都得到了开发者的支持。有必要对二者进行以下对比。

     
     Axis2CXF
    目标 WebService引擎 简易的SOA框架,可以作为ESB
    ws* 标准支持 不支持WS-Policy WS-Addressing,WS-Policy, WS-RM, WS-Security,WS-I Basic Profile
    数据绑定支持 XMLBeans、JiBX、JaxMe 、JaxBRI、ADB JAXB, Aegis, XMLBeans, SDO, JiBX
    spring集成 不支持 支持
    应用集成 困难 简单
    多语言 支持C/C++ 不支持
    部署 web应用 嵌入式
    服务监控和管理 支持 不支持

    结论:

    1. 如果希望以一种一致的方式实现webservice,特别是有跨语言的需求时,应该使用Axis2
    2. 如果需要在现有的java程序(包括web应用)中增加webservice支持,应该使用CXF

    cxf服务端和客户端

    服务端

    pom文件

    <!-- 服务端---->
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.1.10</version>
    </dependency>
    
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.1.10</version>
    </dependency>
    
    <!-- 客户端 -->
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-rs-client</artifactId>
    <version>3.1.10</version>
    </dependency>
    View Code

    web.xml配置

     <!-- 设置Spring容器加载配置文件路径 -->
      <context-param>
      <param-name>contextConfigLocation</param-name>
     <param-value>classpath*:applicationContext-server.xml</param-value>
      </context-param>
      
      <!-- 加载Spring容器配置 -->
      <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>
    
     <servlet>
      <servlet-name>CXFService</servlet-name>
     servletclass>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
     </servlet>
     <servlet-mapping>
     <servlet-name>CXFService</servlet-name>
     <url-pattern>/webservice/*</url-pattern>
     </servlet-mapping>
     </web-app>
    View Code

    spring文件

    xml中添加头文件

    http://cxf.apache.org/jaxws    
    
    http://cxf.apache.org/schemas/jaxws.xsd    
    
    http://cxf.apache.org/jaxrs    
    
    http://cxf.apache.org/schemas/jaxrs.xsd 
    
    具体实现:
    
    <bean id="greetingServiceImpl" class="com.mycompany.webservice.server.GreetingServiceImpl"/>
     <jaxws:endpoint id="greetingService"  implementor="#greetingServiceImpl"   address="/Greeting" />
    View Code

    接口

    1 package com.mycompany.webservice.server;
    2 
    3 import javax.jws.WebService;
    4 
    5 @WebService 
    6 public interface Greeting { 
    7    public String greeting(String userName); 
    8 }
    View Code

    实现类

    package com.mycompany.webservice.server;
    
    import java.util.Calendar;
    import javax.jws.WebService;
    
    @WebService(endpointInterface = "com.mycompany.webservice.server.Greeting")
    public class GreetingServiceImpl implements Greeting {
    
     public String greeting(String userName) {
      return "Hello " + userName + ", currentTime is "
        + Calendar.getInstance().getTime();
     }
    }
    View Code

    客户端

    public class GreetingServiceClient {
     public static void main(String[] args) {
      //创建WebService客户端代理工厂
      JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
      //注册WebService接口
      factory.setServiceClass(Greeting.class);
      //设置WebService地址
      factory.setAddress("http://localhost:8080/yourProgramName/webservice/Greeting");
      Greeting greetingService = (Greeting)factory.create();
      System.out.println("invoke webservice...");
      System.out.println("message context is:"+greetingService.greeting("gary"));   
     }
    }
    View Code

    部署 

    在部署的过程中遇到启动报错的情况 具体问题

    10:30:28,053 INFO  [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] (MSC service thread 1-8) Creating Service {http://cxf.mh.dev.ic.sy/}CXFServiceImplService from class sy.ic.dev.mh.cxf.CXFService
    10:30:28,576 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC000001: Failed to start service jboss.deployment.unit."cps.base.mh.web.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."cps.base.mh.web.war".INSTALL: JBAS018733: 处理 INSTALL 的 deployment "cps.base.mh.web.war" 阶段失败
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:127) [jboss-as-server-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) [rt.jar:1.6.0_43]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) [rt.jar:1.6.0_43]
        at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_43]
    Caused by: javax.xml.ws.WebServiceException: org.apache.cxf.bus.extension.ExtensionException: Could not create object of extension class org.apache.cxf.wsdl11.WSDLManagerImpl.
        at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:371)
        at org.jboss.wsf.stack.cxf.deployment.EndpointImpl.doPublish(EndpointImpl.java:66)
        at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:251)
        at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:539)
        at org.jboss.wsf.stack.cxf.configuration.NonSpringBusHolder.configure(NonSpringBusHolder.java:117)
        at org.jboss.wsf.stack.cxf.deployment.aspect.BusDeploymentAspect.startDeploymentBus(BusDeploymentAspect.java:129)
        at org.jboss.wsf.stack.cxf.deployment.aspect.BusDeploymentAspect.start(BusDeploymentAspect.java:67)
        at org.jboss.as.webservices.deployers.AspectDeploymentProcessor.deploy(AspectDeploymentProcessor.java:74)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:120) [jboss-as-server-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
        ... 5 more
    Caused by: org.apache.cxf.bus.extension.ExtensionException: Could not create object of extension class org.apache.cxf.wsdl11.WSDLManagerImpl.
        at org.apache.cxf.bus.extension.Extension.load(Extension.java:249)
        at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:211)
        at org.apache.cxf.bus.extension.ExtensionManagerImpl.getBeansOfType(ExtensionManagerImpl.java:320)
        at org.apache.cxf.bus.CXFBusImpl.getExtension(CXFBusImpl.java:108)
        at org.apache.cxf.binding.soap.SoapBindingFactory.createSoapBinding(SoapBindingFactory.java:219)
        at org.apache.cxf.binding.soap.SoapBindingFactory.createBindingInfo(SoapBindingFactory.java:207)
        at org.apache.cxf.binding.AbstractBaseBindingFactory.createBindingInfo(AbstractBaseBindingFactory.java:83)
        at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createBindingInfo(AbstractWSDLBasedEndpointFactory.java:341)
        at org.apache.cxf.jaxws.JaxWsServerFactoryBean.createBindingInfo(JaxWsServerFactoryBean.java:182)
        at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpointInfo(AbstractWSDLBasedEndpointFactory.java:259)
        at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:144)
        at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:159)
        at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)
        at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:456)
        at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:334)
        ... 13 more
    Caused by: java.lang.ClassCastException: class org.apache.cxf.binding.corba.wsdl.PolicyType
        at java.lang.Class.asSubclass(Class.java:3027) [rt.jar:1.6.0_43]
        at org.apache.cxf.wsdl.JAXBExtensionHelper.addExtensions(JAXBExtensionHelper.java:91)
        at org.apache.cxf.wsdl11.WSDLManagerImpl.registerInitialXmlExtensions(WSDLManagerImpl.java:304)
        at org.apache.cxf.wsdl11.WSDLManagerImpl.registerInitialExtensions(WSDLManagerImpl.java:274)
        at org.apache.cxf.wsdl11.WSDLManagerImpl.<init>(WSDLManagerImpl.java:126)
        at org.apache.cxf.wsdl11.WSDLManagerImpl.<init>(WSDLManagerImpl.java:94)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.6.0_43]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [rt.jar:1.6.0_43]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [rt.jar:1.6.0_43]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [rt.jar:1.6.0_43]
        at org.apache.cxf.bus.extension.Extension.load(Extension.java:240)
        ... 27 more


    解决:jboss本身对soap有管理,因为已经确定问题就是由jboss eap 6.2引起的,所以到jboss配置文件里找到相关配置。

    在D:jboss-eap-6.3standaloneconfigurationstandalone.xml中,找到以下代码注释掉。

    <!--
            <subsystem xmlns="urn:jboss:domain:webservices:1.2">
                <modify-wsdl-address>true</modify-wsdl-address>
                <wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
                <endpoint-config name="Standard-Endpoint-Config"/>
                <endpoint-config name="Recording-Endpoint-Config">
                    <pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
                        <handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
                    </pre-handler-chain>
                </endpoint-config>
                <client-config name="Standard-Client-Config"/>
            </subsystem>
             -->
    View Code

    虽然是6.3的版本,还是一样的问题  具体参考

    http://blog.csdn.net/u014653497/article/details/28860217?utm_source=tuicool&utm_medium=referral

    cxf客户端调用问题 

    问题如:Unsupported major.minor version 51.0 异常 

    具体参考: https://segmentfault.com/q/1010000002930567

    原因:cxf 3.1.6 已经不支持jdk1.6

    解决办法: 修改当前引用jdk为1.7 问题解决

      

  • 相关阅读:
    自学大数据初期
    研究正则表达式
    智能穿戴设备移动APP端与外设数据传输协议
    集成Facebook SDK
    Core Data数据库迁移
    用Time Machine做更换电脑工具
    iOS Automation Test
    编译libcore-amr静态库
    解决CentOS 7安装zabbix 3.0 无法启动zabbix-server的问题[segfault at 18 ip 00007f78842b4bd0 sp 00007fff1995a818 error 4 in libpthread-2.17.so[7f78842ab000+16000]]
    CentOS 7 安装Percona,Xtrabackup
  • 原文地址:https://www.cnblogs.com/brightly/p/6748907.html
Copyright © 2011-2022 走看看