CXF发布SOAP协议的服务
一、需求
服务端:发布服务,接收客户端的城市名,返回天气数据给客户端
客户端:发送城市名给服务端,接收服务端的响应信息,打印
二、实现
1、服务端
开发步骤:
第一步:导入Jar包
第二步:创建SEI接口,要加入@WebService
package cn.hcx.ws.cxf.server;
import javax.jws.WebService;
/**
*
* <p>Title: WeatherInterface.java</p>
* <p>Description:SEI接口</p>
*/
@WebService
public interface WeatherInterface {
public String queryWeather(String cityName);
}
第三步:创建SEI实现类
package cn.hcx.ws.cxf.server;
/**
*
* <p>Title: WeatherInterfaceImpl.java</p>
* <p>Description:SEI实现类</p>
*/
public class WeatherInterfaceImpl implements WeatherInterface {
@Override
public String queryWeather(String cityName) {
System.out.println("from client..."+cityName);
if("北京".equals(cityName)){
return "冷且霾";
} else {
return "暖且晴";
}
}
}
第四步:发布服务, JaxWsServerFactoryBean发布,设置3个参数,1.服务接口;2.服务实现类;3.服务地址;
endpoint仅支持发布实现类,JaxWsServerFactoryBean支持发布接口。
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.tools.java2wsdl.processor.internal.jaxws.generator.JaxwsServerGenerator;
/**
*
* <p>Title: WeatherServer.java</p>
* <p>Description:服务端</p>
*/
public class WeatherServer {
public static void main(String[] args) {
//JaxWsServerFactoryBean发布服务
JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
//设置服务接口
jaxWsServerFactoryBean.setServiceClass(WeatherInterface.class);
//设置服务实现类
jaxWsServerFactoryBean.setServiceBean(new WeatherInterfaceImpl());
//设置服务地址
jaxWsServerFactoryBean.setAddress("http://127.0.0.1:12345/weather");
//发布
jaxWsServerFactoryBean.create();
}
}
第五步:测试服务是否发布成功,阅读使用说明书,确定关键点
如果在CXF发布的服务下,直接访问服务地址,会如下异常
此时直接访问使用说明书地址即可
发布SOAP1.2的服务端
l 在接口上加入如下注解:
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
l 重新发布服务端
拦截器
l 原理:
Ø 拦截器可以拦截请求和响应
Ø 拦截器可以有多个
Ø 拦截器可以根据需要自定义
l 使用
Ø 拦截器必须加到服务端,在服务端发布之前
Ø 获取拦截器列表,将自己的拦截器加入列表中
2、客户端
第一步:生成客户端代码
wsdl2java命令是CXF提供的生成客户端的工具,他和wsimport类似,可以根据WSDL生成客户端代码
wsdl2java常用参数:
-d,指定输出目录
-p,指定包名,如果不指定该参数,默认包名是WSDL的命名空间的倒序
wsdl2java支持SOAP1.1和SOAP1.2
命令:去到要生成的目录下,src下
wsdl2java -p 包名 -d 要生成到的目录 wsdl服务地址:
wsdl2java -p cn.hcx.cxf.weather -d . http://localhost:13245/weather?wsdl
第二步:使用说明书,使用生成代码调用服务端
JaxWsProxyFactoryBean调用服务端,设置2个参数,1.设置服务接口;2.设置服务地址
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import cn.hcx.cxf.weather.WeatherInterface;
/**
*
* <p>Title: WeatherClient.java</p>
* <p>Description:客户端</p>
*
*/
public class WeatherClient {
public static void main(String[] args) {
//JaxWsProxyFactoryBean调用服务端
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
//设置服务接口
jaxWsProxyFactoryBean.setServiceClass(WeatherInterface.class);
//设置服务地址
jaxWsProxyFactoryBean.setAddress("http://127.0.0.1:12345/weather");
//获取服务接口实例
WeatherInterface weatherInterface = jaxWsProxyFactoryBean.create(WeatherInterface.class);
//调用查询方法
String weather = weatherInterface.queryWeather("保定");
System.out.println(weather);
}
}