首先引入jar包
<!--发布 webservice 服务 begin-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.5</version>
<exclusions>
<exclusion>
<artifactId>cxf-core</artifactId>
<groupId>org.apache.cxf</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.6</version>
</dependency>
<!--webservice end-->
新建配置
package ......;
import com.wl.ltx.sap.webservice.SapReceiveService;
import com.wl.ltx.sap.webservice.SapReceiveServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*sapReceiveService
*@author chufangbo
*@since 2021-09-14
* 配置类
*/
@Configuration
public class CxfConfig {
@Bean(name = "cxfServlet")//名字重复报错的话 重新命名
public ServletRegistrationBean cxfServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/webService/*");
return servletRegistrationBean;
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean
public SapReceiveService sapReceiveService(){
return new SapReceiveServiceImpl();
}
@Bean
public EndpointImpl endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), sapReceiveService());
//SYSID=[TFSAP] 需要给sap保持一致
LoggerFactory.getLogger("CxfConfig").info("--------------------SendSapHead.SYSID=[TFSAP]----------------------自动发布webservice对外服务-------供sap主动调用--------------------------------------------");
//要发布的服务名
endpoint.publish("/sapReceiveService");
return endpoint;
}
}
sap所需要的服务
<!--sap-webservice begin-->
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-dom</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-adb</artifactId>
<version>1.6.2</version>
<exclusions>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-adb-codegen</artifactId>
<version>1.6.2</version>
<exclusions>
<exclusion>
<artifactId>XmlSchema</artifactId>
<groupId>org.apache.ws.commons.schema</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-clustering</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-codegen</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-corba</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-ant-plugin</artifactId>
<version>1.6.2</version>
<exclusions>
<exclusion>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-java2wsdl</artifactId>
</exclusion>
<exclusion>
<artifactId>XmlSchema</artifactId>
<groupId>org.apache.ws.commons.schema</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-fastinfoset</artifactId>
<version>1.6.2</version>
<exclusions>
<exclusion>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-java2wsdl</artifactId>
</exclusion>
<exclusion>
<artifactId>XmlSchema</artifactId>
<groupId>org.apache.ws.commons.schema</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-jaxbri</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-jaxws</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-jibx</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-json</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-kernel</artifactId>
<version>1.6.2</version>
<exclusions>
<exclusion>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</exclusion>
<exclusion>
<artifactId>XmlSchema</artifactId>
<groupId>org.apache.ws.commons.schema</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-metadata</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-mtompolicy</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-saaj</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-soapmonitor-servlet</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-spring</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-local</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-xmlbeans</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>orj.hibersap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/lib/sapjco3.jar</systemPath>
<!-- <systemPath>${project.basedir}/src/lib/sapjco3.jar</systemPath>-->
</dependency>
<!--sap-webservice end -->
暴露服务
package com.wl.ltx.sap.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
/**
* Created by chufangbo 2021-09-11
* CxfConfig配置类
* ZPI004
* http://127.0.0.1:9102/ltx-sapcomponent/webService/sapReceiveService?wsdl 本地验证地址打开是XML页面
* 给sap提供的地址 就是本地验证的地址,如果正式的话提供正式地址
*/
@WebService(name = "sapReceiveService", // 暴露服务名称
targetNamespace = "http://service.sap.ltx.wl.com"// 命名空间 一般是接口包名的倒序
)
public interface SapReceiveService {
//标注该方法为webservice暴露的方法,用于向外公布,它修饰的方法是webservice方法
@WebMethod
@WebResult(name = "String", targetNamespace = "")
String sapSendTo(@WebParam(name = "data") String data);
}
贴sap配置图
接口实现类
package com.wl.ltx.sap.webservice;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.wl.ltx.goods.client.GoodsApiClient;
import com.wl.ltx.goods.param.MaterialReceiveParam;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by chufangbo 2021-09-11
*
* SAP--ZPI004--物料:1020038
* 本地IP http://172.29.53.197:9102/ltx-sapcomponent/webService/sapReceiveService?wsdl
*
*/
@WebService(serviceName = "sapReceiveService", //与接口中的serviceName一致
targetNamespace = "http://service.sap.ltx.wl.com", //与接口中的targetNamespace一致
endpointInterface = "com.wl.ltx.sap.webservice.SapReceiveService")
@Component
public class SapReceiveServiceImpl implements SapReceiveService {
@Resource
private GoodsApiClient goodsApiClient;//商品服务
private static final String SAP_TO_OUT_MATERIAL ="SAP_TO_OUT_MATERIAL";//sap物料主数据
@Override
public String sapSendTo(String data) {
JSONArray array = new JSONArray();
JSONObject json = new JSONObject();
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map = new HashedMap();
try {
json = array.parseObject(data);
if(json!= null){
String dataMsg = json.getString("DATA");
String control = json.getString("CONTROL");
String ifid = JSONObject.parseObject(control).getString("IFID");
// System.out.println("ifid: "+ifid);
// System.out.println("dataMsg: "+dataMsg);
Boolean success = true;
switch (ifid){
case SAP_TO_OUT_MATERIAL:
success = sapToOutMaterial(dataMsg);
break;
default:
map.put("MTYPE","E");
map.put("KEYDATA", "");
map.put("MSGTXT", "接口未定义,无法调取");
}
if(success){
map.put("MTYPE","S");
map.put("KEYDATA", "");
map.put("MSGTXT", "接收并保存数据成功");
}else{
map.put("MTYPE","E");
map.put("KEYDATA", "");
map.put("MSGTXT", "接收并保存数据失败");
}
}else{
map.put("MTYPE","E");
map.put("KEYDATA", "");
map.put("MSGTXT", "接收数据为空");
}
}catch (Exception e){
map.put("MTYPE","E");
map.put("KEYDATA", "");
map.put("MSGTXT", "接收并保存数据"+e.getMessage());
e.printStackTrace();
}finally {
list.add(map);
json.put("DATA",list);
json.put("CONTROL",json.get("CONTROL"));
}
return JSONObject.toJSONString(json);
}
public Boolean sapToOutMaterial(String dataMsg){
Boolean success = true;
try {
System.out.println("SAP主动推送-sapToOutMaterial: "+dataMsg);
List<MaterialReceiveParam> ammeterList = JSONArray.parseArray(dataMsg, MaterialReceiveParam.class);
// MaterialReceiveParam param = JSONObject.parseObject(dataMsg,MaterialReceiveParam.class);
for (MaterialReceiveParam param : ammeterList) {
goodsApiClient.receiveSapMaterial(param);
}
// List<TCAmmeterSapEntity> ammeterList = JSONArray.parseArray(data, TCAmmeterSapEntity.class);
}catch (Exception e){
e.printStackTrace();
success = false;
}finally {
return success;
}
}
}