- 打开eclipse,右键新建一个maven工程,点击next

- 配置maven工程,依次输入groupid, artifactid,其他默认即可,点击Finish按钮

- 编辑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> - 新建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); } - 新建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; } } - 在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 -
新建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...."); } } -
至此,一个使用cxf方式发布webservice接口的功能已经实现,可以在浏览器中输入地址 http://localhost:9082/CalculatorService?wsdl 来查看wsdl文件是否可以访问,如果可以访问,可以借助soapui工具来测试一下,接口调用是否正常。客户端的测试类,这里就不再赘述了,可以参见小编之前写的帖子 使用cxf客户端生成java代码并调用,当然就不用参照帖子中的使用soapui来模拟服务端代码了,因为当前开发的就是服务端代码。当前目录结构如图所示:

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

下面继续开始给ws接口添加自定义拦截器,接着上面的demo继续讲
-
新建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); /** * 在这里,你可以根据业务需求编写自己的代码,小编这里就只打印一行日志,证明一下,这个拦截器是生效的 */ } } -
在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); /** * 在这里,你可以根据业务需求编写自己的代码,小编这里就只打印一行日志,证明一下,这个拦截器是生效的 */ } } -
修改上文提到的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...."); } -
至此,添加自定义拦截器demo也开发完成。项目接口如图所示:

-
下面来测试下,在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); }
相关推荐
我的第一次WebService接口开发教程
一、前言: 工作中,接触到很多系统要互相对接,因为大多数公司(项目)所用的平台不同,要想一方提供数据信息供对方提取,首先想到的就是开放出一个WebService接口调用文档和WebService地址,这样对方就能根据文档地址编程去调用。于是便在网上搜罗相关资料,尝试写一个WebService接口,非科班出身,仅供大家参考、指教。 二、WebService优点: 可远程调用(WebService可以向全世界提供信息,或提供某项功能,只要有网就OK)。 跨平台调用(WebService可以在Window
CXF创建WebService服务配置说明
使用CXF框架创建WebService服务,不需要使用tomcat发布
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
基于CXF的webservice拦截器
CXF webservice 拦截器 定制报文格式
webservice之cxf及整合spring自学结果
webservice之cxf
Jetty:配置概览-怎么配置Jetty
Jetty POJO配置 Jetty的核心组件是Plain Old Java Objects(POJOs);配置Jetty的大部分工作就是在Jetty POJOs上的初始化、装配和设置域的处理,你能通过下面的方式来实现: 1)直接通过Java代码初始化和装配Jetty对象。这个在后面Embedding Jetty讲。 2)用Jetty XML配置(一个控制反转(IoC)框架)初始化和装配
Spring boot WebService 使用快速入门、拦截器,接口调试工具
目录 环境说明 服务端 导入 jar 包 源码展示 配置文件 浏览器访问测试 客户端 wsdl2java 生成代理类 源码内容 浏览器访问测试 配置拦截器 服务端 客户端 访问测试 环境说明 1、本文使用Spring4.3.10 集成 Apache CXF 3.3 。 2、亲测 Java JDK 1.8 + Tomcat 9 集成成功(Tomcat 8 时集成失...
【WebService框架-CXF】——WebService和CXF
在接下来的几篇博客中将对CXF的基础知识和简单应用进行总结。下面列出了要总结的内容。本篇文章集中介绍CXF的基础知识。 CXF博客总结目录WebService和CXF基础知识 CXF入门实例(编写客户端和服务端) CXF对Map等无法自动转化的类型的处理 CXF添加普通拦截器和自定义拦截器 CXF+Spring+自定义拦截器构建WebService服务端 CXF+Spring+Struts
基于spring+cxf框架webService接口开发(1)--服务器端
WebService接口开发(Spring+cxf) 服务器端(认证+加密) 导入Apache cxf.jar包 什么是cxf CXF是建立在SOAP协议上的一个Web service框架。 什么是SOAP协议? 简单来说就是两个不同项目(开发语言不同等)通过xml文件来描述要传输的东西,然后通过HTTP协议传输,接收方把收到的xml解析成需要的对象使用,返回的时候将xml封...
WebService
webservice
java WebService CXF Spring 自定义拦截器 附实例源码
代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!throw new Fault(new IllegalArgumentException(“用户Id格式不对”));throw new Fault(new IllegalArgumentException(“用户密码格式不对”));
cxf WebService整理
项目中需要用到CXF做WS处理,花点时间对其有个简单认识,主要是在安全认证以及日志记录和异常处理这块有要求控制。
CXF与Spring整合中添加拦截器实现WebService权限控制实战
定义拦截器Bean涉及创建一个具体的拦截器实例,并使用@Bean注解将其暴露给Spring容器。@Bean为了实现自定义拦截器,首先要深入理解两个关键接口:和。Fault接口主要涉及在处理消息过程中出现的错误。而则是控制拦截器在Web服务生命周期中不同阶段介入的关键。接口包含多个方法,但最为关键的是方法,它允许你编写拦截器逻辑。自定义拦截器通常需要根据消息的类型(请求或响应)来处理逻辑。例如,你可能需要在消息发送前验证权限,或在消息处理后记录日志。
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...
SpringBoot整合CXF发布WebService接口,及动态调用(用户名和密码验证)
服务端继承AbstractPhaseInterceptor<T>,来实现AuthInterceptor的权限控制功能
WebService开发 - CXF(7) - CXF与Spring整合并添加拦截器输出日志到文件(主流)
博主个人教程地址 前言 今天来说的是 cxf 和 我们当前比较流行的 spring 框架整合使用的例子 当下比较主流的用法 在开始看本篇教程前你需要有学习过Spring哦 这里假设你已经掌握了Spring 采用maven构建项目 开始整合 第一步 Server端 导入POM依赖 这里有CXF和spring的依赖 这里我们没有了jetty的包 因为我们使用了tomcat 导入进去之后 对应依赖的...
WebService学习总结(十)——cxf添加拦截器应用
项目中有时候也会做一些类似于权限验证的东西,拦截器也是一种实现方式。拦截器主要作用是做一些权限过滤,编码处理等。 webService接口也可以上拦截器,我们也可以给webservice请求加权限判断功能; webservice分服务端和客户端,服务端和客户端都是可以加拦截器的,无论是服务端还是客户端,都分进,出(In,Out)拦截器; 可以使用cxf内置拦截器,...
已有ssh项目中加入webservice(CXF)
已有ssh项目编写webService接口
1万+




被折叠的 条评论
为什么被折叠?



