1、CXF框架概念介绍
Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP、POST/HTTP、HTTP ,CXF 大大简化了WebService并且可以天然地和 Spring 进行无缝集成。CXF是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext,CXF默认是依赖于Spring的,另 CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题。CXF 内置了Jetty服务器 ,它是servlet容器。
2、CXF框架特点
- 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
- 支持注解的方式来发布webservice
- 能够显示一个webservice的服务列表
- 能够添加拦截器:输入拦截器、输出拦截器 :输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器
3、用CXF完成接口调用
利用wsdl2java工具生成webservice的客户端代码
3.1. 要有JDK环境
3.2. 载安装apache-cxf
3.3. 解压安装包,设置CXF_HOME:解压后的文件路径
3.4.设置PATH:%CXF_HOME%\bin
3.5.验证:CMD命令行(管理员权限)输入wsdl2java -help,有正常提示说明环境已经正确配置
3.6.解析WSDL文件(保存在线WebService接口(ctrl+s)为CreateNMSF.wsdl)
3.7.运行命令解析
wsdl2java -keep -verbose -encoding utf-8 CreateNMSF.wsdl
3.8.把多出来的两个目录加入到我们工程中
4、测试
@Test
void test() {
/**
* 通过认证(调用的时候只需要在调用接口之前调用执行该方法即可:)
* 最后是用 Java.Net的Authenticator类 把Username和Password直接投过去(他之后对位流的处理遵守http的basic身份验证机制)
*/
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"demo",
"1qaz2wsx".toCharArray());
}
});
SICreateNMSFOutSynService siCreateNMSFOutSynService = new SICreateNMSFOutSynService();
SICreateNMSFOutSyn siCreateNMSFOutSyn = siCreateNMSFOutSynService.getHTTPPort();
MESSAGEHEADER messageheader = new MESSAGEHEADER();
// 接口标识
messageheader.setINTERFACEID("");
// 相关标识
messageheader.setCORRELATIONID("");
// 货物移动抬头数据
ZISMMKPF zismmkpf = new ZISMMKPF();
// GM代码
zismmkpf.setGMCODE("03");
// 凭证中的凭证日期
zismmkpf.setBLDAT("2023-08-07");
// 凭证中的过账日期
zismmkpf.setBUDAT("2023-08-07");
// 用户名
zismmkpf.setUNAME("");
// 凭证抬头文本
zismmkpf.setBKTXT("");
// 移动类型(库存管理)
zismmkpf.setBWART("");
// 工厂
zismmkpf.setWERKS("");
// G/L科目号
zismmkpf.setKONTO("");
// 成本中心
zismmkpf.setKOSTL("");
// 收货方
zismmkpf.setWEMPF("");
// 主资产号
zismmkpf.setANLN1("");
// 销售订单数
zismmkpf.setKDAUF("");
// 采购凭证编号
zismmkpf.setEBELN("");
// 订单编号
zismmkpf.setAUFNR("");
// 预留/相关需求的编号
zismmkpf.setRSNUM("");
// 客户的帐户编号
zismmkpf.setKUNNR("");
// 供应商帐户号
zismmkpf.setLIFNR("");
// 特殊库存标识
zismmkpf.setSOBKZ("");
// 收货工厂/发货工厂
zismmkpf.setUMWRK("");
// 收货/发货库存地点
zismmkpf.setUMLGO("");
// 货物移动行项目数据
ZITFGOODSMVTCREATE.ITMSEG itmseg = new ZITFGOODSMVTCREATE.ITMSEG();
ZISMMSEG zismmseg = new ZISMMSEG();
// 物料编号
zismmseg.setMATNR("01001");
// 工厂
zismmseg.setWERKS("");
// 存储位置
zismmseg.setLGORT("");
// 批号
zismmseg.setCHARG("");
// 特殊库存标识
zismmseg.setSOBKZ("");
// 移动类型(库存管理)
zismmseg.setBWART("");
// 以录入项单位表示的数量
BigDecimal bigDecimal = BigDecimal.valueOf(10);
zismmseg.setERFMG(bigDecimal);
// 条目单位
zismmseg.setERFME("");
// 订单编号
zismmseg.setAUFNR("");
// 订单项目编号
zismmseg.setPOSNR("");
// 销售订单数
zismmseg.setKDAUF("");
// 销售订单中的项目编号
zismmseg.setKDPOS("");
// 采购订单号
zismmseg.setEBELN("");
// 采购凭证的项目编号
zismmseg.setEBELP("");
// 采购订单数量(无值填0)
BigDecimal zero = BigDecimal.ZERO;
zismmseg.setMENGE(zero);
// 采购订单计量单位
zismmseg.setMEINS("");
// 凭证口采用的项目
zismmseg.setTAKEIT("");
// 收货方
zismmseg.setWEMPF("");
// 预留/相关需求的编号
zismmseg.setRSNUM("");
// 预留 / 相关需求的项目编号
zismmseg.setRSPOS("");
itmseg.getItem().add(zismmseg);
ZITFGOODSMVTCREATE zitfgoodsmvtcreate = new ZITFGOODSMVTCREATE();
zitfgoodsmvtcreate.setMESSAGEHEADER(messageheader);
// 流程编号
zitfgoodsmvtcreate.setFLOWID("");
// 是否测试运行,X测试,''执行
zitfgoodsmvtcreate.setITESTRUN("X");
// 关联的SAP创建人账号
zitfgoodsmvtcreate.setERNAM("");
// 货物移动抬头数据
zitfgoodsmvtcreate.setIMKPF(zismmkpf);
// 货物移动行项目数据
zitfgoodsmvtcreate.setITMSEG(itmseg);
ZITFGOODSMVTCREATEResponse zitfgoodsmvtcreateResponse = siCreateNMSFOutSyn.siCreateNMSFOutSyn(zitfgoodsmvtcreate);
String msgtype = zitfgoodsmvtcreateResponse.getMSGTYPE();
String message = zitfgoodsmvtcreateResponse.getMESSAGE();
String matdoc = zitfgoodsmvtcreateResponse.getMATDOC();
String format = String.format("msgtype=%s, message=%s, matdoc=%s", msgtype, message, matdoc);
System.out.println(format);
}