• 五、CXF WebService整合Spring


    首先,CXF和spring整合需要准备如下jar包文件:

    image

    这边我是用Spring的jar包是Spring官方提供的,并没有使用CXF中的Spring的jar文件。

    添加这么多文件后,首先在web.xml中添加如下配置:

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

    然后在src目录中,新建一个applicationContext-server.xml文件,文件内容如下:

     

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans >
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.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-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

    下面开始写服务器端代码,首先定制服务器端的接口,代码如下:

    package com.hoo.service;
     
    import javax.jws.WebParam;
    import javax.jws.WebService;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.Style;
    import com.hoo.entity.User;
    import com.hoo.entity.Users;
     
    /**
     * <b>function:</b>定制客户端请求WebService所需要的接口
     * @author hoojo
     * @createDate 2011-3-18 上午08:22:55
     * @file ComplexUserService.java
     * @package com.hoo.service
     * @project CXFWebService
     * @blog http://blog.csdn.net/IBM_hoojo
     * @email hoojo_@126.com
     * @version 1.0
     */
    @WebService
    @SOAPBinding(style = Style.RPC)
    public interface IComplexUserService {
        
        public User getUserByName(@WebParam(name = "name") String name);
        
        public void setUser(User user);
    }

    下面编写WebService的实现类,服务器端实现代码如下:

    package com.hoo.service;
     
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import javax.jws.WebParam;
    import javax.jws.WebService;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.Style;
    import com.hoo.entity.User;
    import com.hoo.entity.Users;
     
    /**
     * <b>function:</b> WebService传递复杂对象,如JavaBean、Array、List、Map等
     * @author hoojo
     * @createDate 2011-3-18 上午08:22:55
     * @file ComplexUserService.java
     * @package com.hoo.service
     * @project CXFWebService
     * @blog http://blog.csdn.net/IBM_hoojo
     * @email hoojo_@126.com
     * @version 1.0
     */
    @WebService
    @SOAPBinding(style = Style.RPC)
    @SuppressWarnings("deprecation")
    public class ComplexUserService implements IComplexUserService {
        
        public User getUserByName(@WebParam(name = "name") String name) {
            User user = new User();
            user.setId(new Date().getSeconds());
            user.setName(name);
            user.setAddress("china");
            user.setEmail(name + "@hoo.com");
            return user;
        }
        
        public void setUser(User user) {
            System.out.println("############Server setUser###########");
            System.out.println("setUser:" + user);
        }
    }

    注意的是和Spring集成,这里一定要完成接口实现,如果没有接口的话会有错误的。

    下面要在applicationContext-server.xml文件中添加如下配置:

    <bean id="userServiceBean" class="com.hoo.service.ComplexUserService"/>
     
    <bean id="inMessageInterceptor" class="com.hoo.interceptor.MessageInterceptor">
        <constructor-arg  value="receive"/>
    </bean>
     
    <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    <!-- 注意下面的address,这里的address的名称就是访问的WebService的name -->
    <jaxws:server id="userService" serviceClass="com.hoo.service.IComplexUserService" address="/Users">
        <jaxws:serviceBean>
            <!-- 要暴露的 bean 的引用 -->
            <ref bean="userServiceBean"/>
        </jaxws:serviceBean>
        <jaxws:inInterceptors>
            <ref bean="inMessageInterceptor"/>
        </jaxws:inInterceptors>
        <jaxws:outInterceptors>
            <ref bean="outLoggingInterceptor"/>
        </jaxws:outInterceptors>
    </jaxws:server>

    下面启动tomcat服务器后,在WebBrowser中请求:

    http://localhost:8080/CXFWebService/Users?wsdl

    如果你能看到wsdl的xml文件的内容,就说明你成功了,注意的是上面地址的Users就是上面xml配置中的address的名称,是一一对应的。

    下面编写客户端请求的代码,代码如下:

    package com.hoo.client;
     
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import com.hoo.entity.User;
    import com.hoo.service.IComplexUserService;
     
    /**
     * <b>function:</b>请求Spring整合CXF的WebService客户端
     * @author hoojo
     * @createDate 2011-3-28 下午03:20:35
     * @file SpringUsersWsClient.java
     * @package com.hoo.client
     * @project CXFWebService
     * @blog http://blog.csdn.net/IBM_hoojo
     * @email hoojo_@126.com
     * @version 1.0
     */
    public class SpringUsersWsClient {
     
        public static void main(String[] args) {
            //调用WebService
            JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
            factory.setServiceClass(IComplexUserService.class);
            factory.setAddress("http://localhost:8080/CXFWebService/Users");
            
            IComplexUserService service = (IComplexUserService) factory.create();
            
            System.out.println("#############Client getUserByName##############");
            User user = service.getUserByName("hoojo");
            System.out.println(user);
            
            user.setAddress("China-Guangzhou");
            service.setUser(user);
        }
    }

    运行后,可以在控制台中看到

    log4j:WARN No appenders could be found for logger (org.apache.cxf.bus.spring.BusApplicationContext).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    2011-3-28 18:12:26 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
    信息: Creating Service {http://service.hoo.com/}IComplexUserServiceService from class com.hoo.service.IComplexUserService
    #############Client getUserByName##############
    27#hoojo#hoojo@hoo.com#china
    
    Tomcat控制台
     image 

    这个server端是通过Spring整合配置的,下面我们将Client端也通过Spring配置完成整合。

    首先增加applicationContext-client.xml配置文件,文件内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans >
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.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-extension-soap.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
        
        <jaxws:client id="userWsClient" serviceClass="com.hoo.service.IComplexUserService" 
            address="http://localhost:8080/CXFWebService/Users"/>
    </beans>

    客户端请求代码如下:

    package com.hoo.client;
     
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import com.hoo.entity.User;
    import com.hoo.service.IComplexUserService;
     
    /**
     * <b>function:</b>请求Spring整合CXF的WebService客户端
     * @author hoojo
     * @createDate 2011-3-28 下午03:20:35
     * @file SpringUsersWsClient.java
     * @package com.hoo.client
     * @project CXFWebService
     * @blog http://blog.csdn.net/IBM_hoojo
     * @email hoojo_@126.com
     * @version 1.0
     */
    public class SpringUsersWsClient {
     
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
            
            IComplexUserService service = ctx.getBean("userWsClient", IComplexUserService.class);
            
            System.out.println("#############Client getUserByName##############");
            User user = service.getUserByName("hoojo");
            System.out.println(user);
            
            user.setAddress("China-Guangzhou");
            service.setUser(user);
        }
    }

    运行后结果如下:

    #############Client getUserByName##############
    45#hoojo#hoojo@hoo.com#china
    ############Server setUser###########
    setUser:45#hoojo#hoojo@hoo.com#China-Guangzhou
  • 作者:hoojo
    出处:
    blog:http://blog.csdn.net/IBM_hoojo
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权所有,转载请注明出处 本文出自:
分享道版权所有,欢迎转载,转载请注明出处,谢谢
收藏
关注
评论
  • 相关阅读:
    Ext学习之路——Ext.application
    MVVM模式理解
    MVC和MVVM的区别
    如何才能通俗易懂的解释js里面的‘闭包’?
    【移动端】用Cordova将vue项目打包成app
    【vue源码】js中的with语句
    【移动端】移动端点击可点击元素时,出现蓝色默认背景色
    【人脸识别】纯前端实现人脸融合-调用Face++的人脸融合API接口实现
    new Function()语法
    Element-ui 自定义下拉框,实现选择图片并且回显图片
  • 原文地址:https://www.cnblogs.com/hoojo/p/1999563.html
  • Copyright © 2020-2023  润新知