4.0.0
com.demo
ws-demo-cxf
0.0.1-SNAPSHOT
1.7
UTF-8
3.1.4
1.6.1
org.apache.cxf
cxf-core
${cxf-version}
org.apache.cxf
cxf-rt-transports-http-jetty
${cxf-version}
org.apache.cxf
cxf-rt-frontend-jaxws
${cxf-version}
org.slf4j
slf4j-api
${slf4j-version}
org.slf4j
slf4j-log4j12
${slf4j-version}
ws-demo
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
${java-version}
/**
*
* 文件名: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);
}
/**
*
* 文件名: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;
}
}
### \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....");
}
下面来测试下,在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);
}