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

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
  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);
    }
    

     

CXF实战之RESTFul服务(七) JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API。JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架。JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey、Apache CXF等。 阅读详情

相关推荐

我的第一次WebService接口开发教程

一、前言: 工作中,接触到很多系统要互相对接,因为大多数公司(项目)所用的平台不同,要想一方提供数据信息供对方提取,首先想到的就是开放出一个WebService接口调用文档和WebService地址,这样对方就能根据文档地址编程去调用。于是便在网上搜罗相关资料,尝试写一个WebService接口,非科班出身,仅供大家参考、指教。 二、WebService优点: 可远程调用(WebService可以向全世界提供信息,或提供某项功能,只要有网就OK)。 跨平台调用(WebService可以在Window

南清风 1万+

CXF创建WebService服务配置说明

使用CXF框架创建WebService服务,不需要使用tomcat发布

weixin_46090515的博客 1158

CXF整合Spring发布WebService实例

一、说明: 上一篇简单介绍了CXF以及如何使用CXF发布一个简单的WebService服务,且介绍了客户端的调用。 这一篇介绍如何使用CXF与spring在Web项目中来发布WebService服务,CXF版本为3.1.4 ,Spring版本为4.1.7 ,JDK版本 1.7 ,Tomcat 7 二、实例实现过程: 首先略过CXF、以及spring的下载过程。 ①    新建 J

无羁之风的专栏 8105

基于CXFwebservice拦截器

CXF webservice 拦截器 定制报文格式

u014543166的博客 1354

webservicecxf及整合spring自学结果

webservicecxf

学而不敲则罔,敲而不学则殆 389

Jetty:配置概览-怎么配置Jetty

Jetty POJO配置 Jetty的核心组件是Plain Old Java Objects(POJOs);配置Jetty的大部分工作就是在Jetty POJOs上的初始化、装配和设置域的处理,你能通过下面的方式来实现:  1)直接通过Java代码初始化和装配Jetty对象。这个在后面Embedding Jetty讲。  2)用Jetty XML配置(一个控制反转(IoC)框架)初始化和装配

宁静致远 1万+

Spring boot WebService 使用快速入门、拦截器接口调试工具

目录 环境说明 服务端 导入 jar 包 源码展示 配置文件 浏览器访问测试 客户端 wsdl2java 生成代理类 源码内容 浏览器访问测试 配置拦截器 服务端 客户端 访问测试 环境说明 1、本文使用Spring4.3.10 集成 Apache CXF 3.3 。 2、亲测 Java JDK 1.8 + Tomcat 9 集成成功(Tomcat 8 时集成失...

蚩尤后裔-汪茂雄 7298

WebService框架-CXF】——WebServiceCXF

在接下来的几篇博客中将对CXF的基础知识和简单应用进行总结。下面列出了要总结的内容。本篇文章集中介绍CXF的基础知识。 CXF博客总结目录WebServiceCXF基础知识 CXF入门实例(编写客户端和服务端) CXF对Map等无法自动转化的类型的处理 CXF添加普通拦截器自定义拦截器 CXF+Spring+自定义拦截器构建WebService服务端 CXF+Spring+Struts

To Begin,Begin   2399

基于spring+cxf框架webService接口开发(1)--服务器端

WebService接口开发(Spring+cxf) 服务器端(认证+加密) 导入Apache  cxf.jar包 什么是cxf CXF是建立在SOAP协议上的一个Web service框架。 什么是SOAP协议? 简单来说就是两个不同项目(开发语言不同等)通过xml文件来描述要传输的东西,然后通过HTTP协议传输,接收方把收到的xml解析成需要的对象使用,返回的时候将xml封...

zhoumimi_comeon123的博客 4869

WebService

webservice

射手座的程序媛的专栏 2837

java WebService CXF Spring 自定义拦截器 附实例源码

代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!throw new Fault(new IllegalArgumentException(“用户Id格式不对”));throw new Fault(new IllegalArgumentException(“用户密码格式不对”));

2401_83703893的博客 722

cxf WebService整理

项目中需要用到CXF做WS处理,花点时间对其有个简单认识,主要是在安全认证以及日志记录和异常处理这块有要求控制。

大萌小路 1万+

CXF与Spring整合中添加拦截器实现WebService权限控制实战

定义拦截器Bean涉及创建一个具体的拦截器实例,使用@Bean注解将其暴露给Spring容器。@Bean为了实现自定义拦截器,首先要深入理解两个关键接口:和。Fault接口主要涉及在处理消息过程中出现的错误。而则是控制拦截器在Web服务生命周期中不同阶段介入的关键。接口包含多个方法,但最为关键的是方法,它允许你编写拦截器逻辑。自定义拦截器通常需要根据消息的类型(请求或响应)来处理逻辑。例如,你可能需要在消息发送前验证权限,或在消息处理后记录日志。

weixin_36289742的博客 1025

cxf head添加前缀_SpringBoot+CXF 实现简单的webservice,支持Basic验证

SpringBoot+CXF 实现简单的webservice,支持Basic验证pom.xml 添加的依赖 org.apache.cxf cxf-spring-boot-starter-jaxws 3.1.15一个简单的 interface 标记为webservice接口package com.wzh.demo.webservice.service;import javax.j...

weixin_39747511的博客 797

SpringBoot整合CXF发布WebService接口,及动态调用(用户名和密码验证)

服务端继承AbstractPhaseInterceptor<T>,来实现AuthInterceptor的权限控制功能

SuperSunnyBoy的博客 7865

WebService开发 - CXF(7) - CXF与Spring整合添加拦截器输出日志到文件(主流)

博主个人教程地址 前言 今天来说的是 cxf 和 我们当前比较流行的 spring 框架整合使用的例子 当下比较主流的用法 在开始看本篇教程前你需要有学习过Spring哦 这里假设你已经掌握了Spring 采用maven构建项目 开始整合 第一步 Server端 导入POM依赖 这里有CXF和spring的依赖 这里我们没有了jetty的包 因为我们使用了tomcat 导入进去之后 对应依赖的...

路克森的博客 730

WebService学习总结(十)——cxf添加拦截器应用

项目中有时候也会做一些类似于权限验证的东西,拦截器也是一种实现方式。拦截器主要作用是做一些权限过滤,编码处理等。       webService接口也可以上拦截器,我们也可以给webservice请求加权限判断功能;       webservice分服务端和客户端,服务端和客户端都是可以加拦截器的,无论是服务端还是客户端,都分进,出(In,Out)拦截器;      可以使用cxf内置拦截器,...

changhenshui1990的博客 1107

已有ssh项目中加入webserviceCXF

已有ssh项目编写webService接口

ccbbccaa的博客 3000
上一篇: ServiceMix入门(4):在servicemix中部署自己的第一个webservice接口
下一篇: ngrok免费映射内网到公网
Min_Monk
博客等级 码龄11年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值