- 打开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); }
使用cxf发布webservice接口,并添加自定义拦截器
最新推荐文章于 2023-06-01 15:34:46 发布