使用cxf发布webservice接口,并添加自定义拦截器

  1. 打开eclipse,右键新建一个maven工程,点击next
  2. 配置maven工程,依次输入groupid, artifactid,其他默认即可,点击Finish按钮
  3. 编辑pom文件,加入CXF依赖
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.demo</groupId>
    	<artifactId>ws-demo-cxf</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    
    	<properties>
    		<java-version>1.7</java-version>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<cxf-version>3.1.4</cxf-version>
    		<slf4j-version>1.6.1</slf4j-version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.apache.cxf</groupId>
    			<artifactId>cxf-core</artifactId>
    			<version>${cxf-version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.cxf</groupId>
    			<artifactId>cxf-rt-transports-http-jetty</artifactId>
    			<version>${cxf-version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.cxf</groupId>
    			<artifactId>cxf-rt-frontend-jaxws</artifactId>
    			<version>${cxf-version}</version>
    		</dependency>
    		
    		<dependency>
    		    <groupId>org.slf4j</groupId>
    		    <artifactId>slf4j-api</artifactId>
    		    <version>${slf4j-version}</version>
    		</dependency>
    		<dependency>
    		    <groupId>org.slf4j</groupId>
    		    <artifactId>slf4j-log4j12</artifactId>
    		    <version>${slf4j-version}</version>
    		</dependency>
    	</dependencies>
    	
    	<build>
    		<finalName>ws-demo</finalName>
    		<!-- <defaultGoal>compile</defaultGoal> -->
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.5.1</version>
    				<configuration>
    					<source>${java-version}</source>
    					<target>${java-version}</target>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>

     

  4. 新建package:com.demo.service,增加接口定义类CalculatorService.java
    /**
     * 
     * 文件名:HelloWord.java
     * 版权: Copyright 2017-2022 CMCC All Rights Reserved.
     * 描述: ESB管理系统
     */
    package com.demo.service;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    
    /**
     * 接口定义类
     * @author Monk
     * @version V1.0
     * @date 2019年6月27日 下午4:00:47
     */
    @WebService(targetNamespace="http://www.monk.com/", portName="CustomerServicePort", serviceName="CalculatorService")
    public interface CalculatorService {
        
        /**
         * 加法
         * @param param1
         * @param param2
         * @author Monk
         * @date 2019年6月27日 下午4:31:05
         */
        @WebMethod
        @WebResult(name = "out")
        public int addition(@WebParam(name = "param1") Integer param1, @WebParam(name = "param2")  Integer param2);
    
        /**
         * 减法
         * @param param1
         * @param param2
         * @author Monk
         * @date 2019年6月27日 下午4:31:30
         */
        @WebMethod
        @WebResult(name = "out")
        public int subtraction(@WebParam(name = "param1")  Integer param1, @WebParam(name = "param2")  Integer param2);
    }
    
  5. 新建package:com.demo.service.impl,增加接口实现类CalculatorServiceImpl.java
    /**
     * 
     * 文件名:HelloWordImpl.java
     * 版权: Copyright 2017-2022 CMCC All Rights Reserved.
     * 描述: ESB管理系统
     */
    package com.demo.service.impl;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.demo.service.CalculatorService;
    
    /**
     * 接口实现类
     * @author Monk
     * @version V1.0
     * @date 2019年6月27日 下午4:01:33
     */
    public class CalculatorServiceImpl implements CalculatorService{
    
        private static Logger logger = LoggerFactory.getLogger(CalculatorServiceImpl.class);
        
        @Override
        public int addition(Integer param1, Integer param2) {
            logger.info("The addition method is invoke, the input param:[{},{}]", new Object[] {param1, param2});
           return param1 + param2;
        }
    
        @Override
        public int subtraction(Integer param1, Integer param2) {
            logger.info("The subtraction method is invoke, the input param:[{},{}]", new Object[] {param1, param2});
            return param1 - param2;
        }
    
    }
    
  6. 在src/ main/resource目录下新增log4j.properties文件,来配置日志输出。当然这个配置文件,可以自己定义,可以网上自行搜索
    ### \u8BBE\u7F6E###
    log4j.rootLogger = info,stdout
    log4j.logger.org.apache.camel=DEBUG
    ### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    #log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
    
  7. 新建package:com.demo.test,新增测试发布类:TestPublish.java。

    package com.demo.test;
    
    import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.demo.service.CalculatorService;
    import com.demo.service.impl.CalculatorServiceImpl;
    
    /**
     * 测试类,发布webservice,可以用来debug测试接口的可用性
     * 
     * @author Monk
     * @version V1.0
     * @date 2019年7月25日 下午5:04:14
     */
    public class TestPublish {
        private static Logger logger = LoggerFactory.getLogger(TestPublish.class);
    
        public static void main(String[] args) {
             publishByCxf();
        }
    
        /**
         * 使用CXF的方式发布WS接口
         */
        public static void publishByCxf() {
            logger.info("publish webservice by cxfFactory start....");
            logger.info("web Service start");
            CalculatorServiceImpl implementor = new CalculatorServiceImpl();
            String address = "http://localhost:9082/CalculatorService";
            JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
            factoryBean.setAddress(address); // 设置暴露地址
            factoryBean.setServiceClass(CalculatorService.class); // 接口类
            factoryBean.setServiceBean(implementor); // 设置实现类
            factoryBean.create();
            logger.info("publish webservice by cxfFactory success....");
        }
    }
    
  8. 至此,一个使用cxf方式发布webservice接口的功能已经实现,可以在浏览器中输入地址  http://localhost:9082/CalculatorService?wsdl  来查看wsdl文件是否可以访问,如果可以访问,可以借助soapui工具来测试一下,接口调用是否正常。客户端的测试类,这里就不再赘述了,可以参见小编之前写的帖子  使用cxf客户端生成java代码并调用,当然就不用参照帖子中的使用soapui来模拟服务端代码了,因为当前开发的就是服务端代码。当前目录结构如图所示:

  9.  

    在TestPublish.java类中,右键Run as Java Application,就可以发布这个简单的webservice接口了,控制台输出已经状态如下:

     

     


    下面继续开始给ws接口添加自定义拦截器,接着上面的demo继续讲

  10. 新建package,com.demo.interceptor,增加输入拦截器CustomerInInterceptor.java

    /**
     * 
     * 文件名:CustomerInterceptor.java
     * 版权: Copyright 2017-2022 CMCC All Rights Reserved.
     * 描述: ESB管理系统
     */
    package com.demo.interceptor;
    
    
    
    import org.apache.cxf.interceptor.Fault;
    import org.apache.cxf.interceptor.LoggingInInterceptor;
    import org.apache.cxf.message.Message;
    import org.apache.cxf.phase.Phase;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     *
     * @author Monk
     * @version V1.0
     * @date 2019年7月30日 下午5:06:49
     */
    public class CustomerInInterceptor extends LoggingInInterceptor{
        
        private static Logger logger = LoggerFactory.getLogger(CustomerInInterceptor.class);
        
        
        public CustomerInInterceptor() {
            super(Phase.RECEIVE);
        }
        
        @Override
        public void handleMessage(Message message) throws Fault{
            logger.info("---------------------invoke method : CustomerInInterceptor.handleMessage-----------------------" + message);
            /**
             * 在这里,你可以根据业务需求编写自己的代码,小编这里就只打印一行日志,证明一下,这个拦截器是生效的
             */
        }
    }
    

     

  11. 在com.demo.interceptor包下增加输出拦截器CustomerOutInterceptor.java

    /**
     * 
     * 文件名:CustomerInterceptor.java
     * 版权: Copyright 2017-2022 CMCC All Rights Reserved.
     * 描述: ESB管理系统
     */
    package com.demo.interceptor;
    
    
    import org.apache.cxf.interceptor.Fault;
    import org.apache.cxf.interceptor.LoggingInInterceptor;
    import org.apache.cxf.message.Message;
    import org.apache.cxf.phase.Phase;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     *
     * @author Monk
     * @version V1.0
     * @date 2019年7月30日 下午5:06:49
     */
    public class CustomerOutInterceptor extends LoggingInInterceptor{
        
        private static Logger logger = LoggerFactory.getLogger(CustomerOutInterceptor.class);
        
        
        public CustomerOutInterceptor() {
            super(Phase.PRE_STREAM);
        }
        
        @Override
        public void handleMessage(Message message) throws Fault{
            logger.info("---------------------invoke method : CustomerOutInterceptor.handleMessage-----------------------" + message);
            /**
             * 在这里,你可以根据业务需求编写自己的代码,小编这里就只打印一行日志,证明一下,这个拦截器是生效的
             */
        }
    }
    

     

  12. 修改上文提到的TeshPublish.java类,添加拦截器,使拦截器生效

    /**
         * 使用CXF的方式发布WS接口
         */
        public static void publishByCxf() {
            logger.info("publish webservice by cxfFactory start....");
            logger.info("web Service start");
            CalculatorServiceImpl implementor = new CalculatorServiceImpl();
            String address = "http://localhost:9082/CalculatorService";
            JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
            factoryBean.setAddress(address); // 设置暴露地址
            factoryBean.setServiceClass(CalculatorService.class); // 接口类
            factoryBean.setServiceBean(implementor); // 设置实现类
            
            /**
             * 添加拦截器
             * 注意:
             *      这里由于输入拦截器和输出拦截器的构造方法中的Phase类型不一样,所以拦截器也需要对号入座,
             *      输入拦截器就添加到输入拦截器集合中,输出拦截器就添加到输出拦截器集合中
             *      输入对应Phase.RECEIVE
             *      输出对应Phase.PRE_STREAM
             */
            factoryBean.getInInterceptors().add(new CustomerInInterceptor());
            factoryBean.getOutInterceptors().add(new CustomerOutInterceptor());
            factoryBean.create();
            logger.info("publish webservice by cxfFactory success....");
        }
  13. 至此,添加自定义拦截器demo也开发完成。项目接口如图所示:

  14. 下面来测试下,在TestPublish.java类中,右键Run as Java Application,待接口发布成功后,在soapui中调用下,从输出的日志中可以看到我们添加的自定义拦截器已经生效,因为拦截器中添加的日志已经在控制台中打印出来,并且先输出了输入拦截器中(CustomerInInterceptor.java)的日志,然后再输出拦截器中(CustomerOutInterceptor.java)的日志


    上面演示的是在Main方法中,使用JaxWsServerFactoryBean在创建ws实例的时候添加的自定义拦截器,这里再引入两个注解,可以使代码更简洁 @InInterceptors @OutInterceptors,修改com.demo.service.CalculatorService.java,代码如下所示:              Tips:如果通过注解的方式添加了自定义拦截器,就没有必要在FactoryBean创建实例的时候再去手动添加拦截器了

    /**
     * 
     * 文件名:HelloWord.java
     * 版权: Copyright 2017-2022 CMCC All Rights Reserved.
     * 描述: ESB管理系统
     */
    package com.demo.service;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    
    import org.apache.cxf.interceptor.InInterceptors;
    import org.apache.cxf.interceptor.OutInterceptors;
    
    /**
     * 接口定义类
     * @author Monk
     * @version V1.0
     * @date 2019年6月27日 下午4:00:47
     */
    @WebService(targetNamespace="http://www.monk.com/", portName="CustomerServicePort", serviceName="CalculatorService")
    @InInterceptors(interceptors = "com.demo.interceptor.CustomerInInterceptor")
    @OutInterceptors(interceptors = "com.demo.interceptor.CustomerOutInterceptor")
    public interface CalculatorService {
        
        /**
         * 加法
         * @param param1
         * @param param2
         * @author Monk
         * @date 2019年6月27日 下午4:31:05
         */
        @WebMethod
        @WebResult(name = "out")
        public int addition(@WebParam(name = "param1") Integer param1, @WebParam(name = "param2")  Integer param2);
    
        /**
         * 减法
         * @param param1
         * @param param2
         * @author Monk
         * @date 2019年6月27日 下午4:31:30
         */
        @WebMethod
        @WebResult(name = "out")
        public int subtraction(@WebParam(name = "param1")  Integer param1, @WebParam(name = "param2")  Integer param2);
    }
    

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值