微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CXF 生成Webservice以及调用

最近我们的系统需要和一个第三方系统对接,对接的方式是通过web service,所以就学习了一下这方面的东西

用CXF来做web service是比较简单的,本文就简单介绍一下如何一步步发布web service,以及调用现有的web service。另外如果系统已经使用了Spring MVC,那么引入CXF需要额外的步骤,见本人另外一篇博客http://kyfxbl.iteye.com/blog/1432920。如果展现层没有用spring mvc,而是用struts2之类的,可以省去这一步
首先介绍怎么发布web service:
第1步是创建一个普通的java接口,然后用@WebService注解声明这是一个web service

Java代码  

收藏代码

    @H_404_23@

    package com.huawei.framework.webservice;  

    @H_404_23@

    @H_404_23@

    import javax.jws.WebService;  

    @H_404_23@

    @H_404_23@

    import com.huawei.framework.model.User;  

    @H_404_23@

    @H_404_23@

    @WebService

    @H_404_23@

    publicinterface HelloWorld {  

    @H_404_23@

    @H_404_23@

       String sayHi(User user);  

    @H_404_23@

    @H_404_23@

    }  


可以看到,这个接口非常普通,不需要继承什么额外的接口,只需要注解一个@WebService就可以
第2步当然是需要给这个接口提供一个实现类
Java代码  

收藏代码

    @H_404_23@

    package com.huawei.framework.webservice;  

    @H_404_23@

    @H_404_23@

    import com.huawei.framework.model.User;  

    @H_404_23@

    @H_404_23@

    publicclass HelloWorldImpl implements HelloWorld {  

    @H_404_23@

    @H_404_23@

    public String sayHi(User theUser) {  

    @H_404_23@

    return"Hello " + theUser.getName() + ",your age is "

    @H_404_23@

                   + theUser.getAge();  

    @H_404_23@

       }  

    @H_404_23@

    @H_404_23@

    }  


这个类更加简单,连注解都省了,但是如果这个类实现了不止一个接口,那么就需要加上@WebService注解,不过一般不会这样
第3步就到了cxf出场的时候了,需要在spring配置文件加上cxf的配置
Xml代码  

收藏代码

    @H_404_23@

    <?xmlversion="1.0"encoding="UTF-8"?>

    @H_404_23@

    @H_404_23@

    <beansxmlns="http://www.springframework.org/schema/beans"

    @H_404_23@

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"

    @H_404_23@

    xsi:schemaLocation="http://www.springframework.org/schema/beans  

    @H_404_23@

                               http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  

    @H_404_23@

                               http://cxf.apache.org/jaxws  

    @H_404_23@

                               http://cxf.apache.org/schemas/jaxws.xsd">

    @H_404_23@

    @H_404_23@

    <importresource="classpath:meta-inf/cxf/cxf.xml"/>

    @H_404_23@

    <importresource="classpath:meta-inf/cxf/cxf-servlet.xml"/>

    @H_404_23@

    @H_404_23@

    <jaxws:endpointid="helloWorld"

    @H_404_23@

    implementorClass="com.huawei.framework.webservice.HelloWorldImpl"

    @H_404_23@

    address="/HelloWorld"/>

    @H_404_23@

    @H_404_23@

    </beans>


这里只写了CXF所需的配置,spring配置文件的其他内容已省略。用到的元素是<jaxws:endpoint>,implementorClass属性就是我们提供的实现类,然后address属性是这个web service对外暴露的路径
最后第4步是在web.xml中加载cxf
Xml代码  

收藏代码

    @H_404_23@

    <?xmlversion="1.0"encoding="UTF-8"?>

    @H_404_23@

    <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    @H_404_23@

    xmlns="http://java.sun.com/xml/ns/javaee"

    @H_404_23@

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

    @H_404_23@

    id="MyFramework"version="3.0">

    @H_404_23@

    @H_404_23@

    <display-name>MyFramework</display-name>

    @H_404_23@

    @H_404_23@

    <context-param>

    @H_404_23@

    <param-name>contextConfigLocation</param-name>

    @H_404_23@

    <param-value>

    @H_404_23@

               WEB-INF/beans.xml, 

    @H_404_23@

               WEB-INF/cxf.xml  

    @H_404_23@

    </param-value>

    @H_404_23@

    </context-param>

    @H_404_23@

    @H_404_23@

    <listener>

    @H_404_23@

    <listener-class>

    @H_404_23@

               org.springframework.web.context.ContextLoaderListener    

    @H_404_23@

    </listener-class>

    @H_404_23@

    </listener>

    @H_404_23@

    @H_404_23@

    <servlet>

    @H_404_23@

    <servlet-name>framework</servlet-name>

    @H_404_23@

    <servlet-class>org.springframework.web.servlet.dispatcherServlet</servlet-class>

    @H_404_23@

    <init-param>

    @H_404_23@

    <param-name>contextConfigLocation</param-name>

    @H_404_23@

    <param-value>WEB-INF/spring-mvc.xml</param-value>

    @H_404_23@

    </init-param>

    @H_404_23@

    <load-on-startup>1</load-on-startup>

    @H_404_23@

    </servlet>

    @H_404_23@

    @H_404_23@

    <servlet-mapping>

    @H_404_23@

    <servlet-name>framework</servlet-name>

    @H_404_23@

    <url-pattern>/</url-pattern>

    @H_404_23@

    </servlet-mapping>

    @H_404_23@

    @H_404_23@

    <servlet>

    @H_404_23@

    <servlet-name>CXFServlet</servlet-name>

    @H_404_23@

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

    @H_404_23@

    <load-on-startup>2</load-on-startup>

    @H_404_23@

    </servlet>

    @H_404_23@

    @H_404_23@

    <servlet-mapping>

    @H_404_23@

    <servlet-name>CXFServlet</servlet-name>

    @H_404_23@

    <url-pattern>/webservice/*</url-pattern>

    @H_404_23@

    </servlet-mapping>

    @H_404_23@

    @H_404_23@

    </web-app>


这里写的比较复杂,是为了兼容spring mvc。这里把/webservice/*作为对外暴露的路径,和上面的web service address要结合起来,比如说http://ip:port/app_name/webservice/HelloWorld,就会指向这个例子里声明的web service接口
通过以上4步,就发布了一个web service,在浏览器里输入http://ip:port/app_name/webservice,就会看到这个sayHi的web service了,并且cxf已经自动生成了wsdl文件
然后介绍一下怎么通过cxf调用已有的web service
第1步是需要“获得”web service的对应接口类,这里的“获得”有多种情况。在条件允许的情况下,比如2个子系统都是自己项目组开发的,或者对方愿意提供,那么直接拷贝过来就可以了。但一般是没有这么方便的。。那么这种情况下,就是wsdl发挥作用的时候了。只要对方发布了web service,就一定会有一个wsdl文件,那么可以根据这个wsdl文件来手写还原java接口类和所需的实体类(比如本例中的User模型类),还有一个办法就是用wsdl2java工具,生成所需的类
在这个例子中,我直接把HelloWorld.java拷贝过来就行了,注意拷贝过来的时候,@WebService注解还是需要的
第2步是配置cxf,这里用到的是<jaxws:client>元素,和上面的<jaxws:endpoint>是对应的

    @H_404_23@

    <?xmlversion="1.0"encoding="UTF-8"?>

    @H_404_23@

    @H_404_23@

    <beansxmlns="http://www.springframework.org/schema/beans"

    @H_404_23@

    xmlns:jaxws="http://cxf.apache.org/jaxws"

    @H_404_23@

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    @H_404_23@

    xsi:schemaLocation="http://www.springframework.org/schema/beans  

    @H_404_23@

                           http://www.springframework.org/schema/beans/spring-beans.xsd  

    @H_404_23@

                           http://cxf.apache.org/jaxws  

    @H_404_23@

                           http://cxf.apache.org/schemas/jaxws.xsd">

    @H_404_23@

    @H_404_23@

    <beanid="propertyConfigurer"

    @H_404_23@

    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    @H_404_23@

    <propertyname="locations">

    @H_404_23@

    <list>

    @H_404_23@

    <value>classpath:webservice_address.properties</value>

    @H_404_23@

    </list>

    @H_404_23@

    </property>

    @H_404_23@

    </bean>

    @H_404_23@

    @H_404_23@

    <jaxws:clientid="helloClient"serviceClass="com.huawei.webservice.client.HelloWorld"

    @H_404_23@

    address="${helloworld}"/>

    @H_404_23@

    @H_404_23@

    </beans>


其中serviceClass属性,就是指向HelloWorld所在的位置,address是目标web service的地址,也就是http://ip:port/app_name/webservice/HelloWorld
这里有一个额外的东西,就是把所有的address,放在单独的webservice_address.properties文件里管理,这样如果用到的web service比较多时,可以集中维护,不需要修改spring配置文件
第3步就是执行,十分简单
Java代码  

收藏代码

    @H_404_23@

    publicclass Main {  

    @H_404_23@

    @H_404_23@

    publicstaticvoid main(String[] args) {  

    @H_404_23@

    @H_404_23@

           ApplicationContext context = new ClasspathXmlApplicationContext(  

    @H_404_23@

    "cxf.xml");  

    @H_404_23@

           HelloWorld client = (HelloWorld) context.getBean("helloClient");  

    @H_404_23@

    @H_404_23@

           User user = new User();  

    @H_404_23@

           user.setName("zhengshengdong");  

    @H_404_23@

    @H_404_23@

           String message = client.sayHi(user);  

    @H_404_23@

           System.out.println(message);  

    @H_404_23@

       }  

    @H_404_23@

    @H_404_23@

    }  


上面可以看到,首先是启动spring容器,然后像获取普通的bean一样,用getBean()方法实例化HelloWorld接口,然后直接在其上调用sayHi()方法即可
在这个过程中,CXF对底层的复杂操作进行了封装,包括将实体数据封装成soap格式的消息,然后塞到http的request post里,发送到目标web service。然后从返回的http response中取出soap格式的消息,再反向解析,生成实体对象

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐