持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
1、前言
上一次为大家分享了WebService的一些基本知识与使用场景,本次为大家分享下实际开发中的一些总结。本文中是基于SSM项目开发的有需要的伙伴可以参考借鉴一下。
2、准备工作
2.1、引入Apache CXF
这里通过maven方式引入,找到适合的版本引入即可,需要注意下CXF框架中的依赖包是否与项目中的其他依赖有冲突。同时为了稳定起见,尽量避免引入的版本太老或者太新。
2.2、创建WebService配置文件
示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath*:META-INF/cxf/cxf.xml"/>
<jaxws:endpoint implementor="#cfControlDownMsgRecWsService" address="/cfDown"/>
<jaxws:endpoint implementor="#cfControlUpMsgRecWsService" address="/cfUp"/>
<jaxws:endpoint implementor="#cfControlUpMsgRecHtWsService" address="/heart"/>
</beans>
注意:如果CXF版本小于3.0,要在配置文件里额外加入下面两行,不然项目启动时可能会报错。
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
2.3、初始化WebService
实现WebApplicationInitializer接口,在项目启动时加载WebService配置文件。
public class WebServiceInit implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
ServletRegistration.Dynamic dynamic = servletContext.addServlet("ws", CXFServlet.class);
dynamic.setInitParameter("config-location", "classpath*:org/cpms/wsservice/webservice.xml");
dynamic.addMapping("/ws/*");
FilterRegistration.Dynamic dynamicFilter = servletContext.addFilter("webServiceFilter", DelegatingFilter.class);
dynamicFilter.setAsyncSupported(true);
dynamicFilter.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "ws");
}
}
2.4、定义WebServiceFilter
这里主要是为了在某些特定的请求中,设置其编码格式等。
@Component
public class WebServiceFilter extends OncePerRequestFilter {
private final static String ENCODING = "UTF-8";
private static final Logger logger = LoggerFactory.getLogger("rest");
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (request.getContentType() != null && request.getContentType().startsWith(MediaType.TEXT_XML_VALUE)) {
response = new LoggingBodyHttpServletResponse(response, logger);
request.setCharacterEncoding(ENCODING);
response.setCharacterEncoding(ENCODING);
}
filterChain.doFilter(request, response);
}
}
3、创建WebService接口
/**
* webservice报文接收接口
*/
public interface IMsgRecWsService {
public String msgRecService(String msg);
}
4、创建WebService实现类
使用RPC方式
/**
* 心跳服务
*/
@Component("cfControlHtWsService")
@WebService(targetNamespace = "http://baws.com/")
@SOAPBinding(style = Style.RPC)
public class cfControlHtWsService implements IMsgRecWsService{
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public String msgRecService(String json) {
json = json.trim();
logger.info("【心跳服务】接收请求报文:{}" , json);
JSONObject jsonObject = JSONObject.parseObject(json);
String heartStatusArray = jsonObject.getString("HeartStatusList");
List<HeartStatus> heartLists = JSONObject.parseArray(heartStatusArray, HeartStatus.class);
List<HeartStatus> retHeartLists = setHeartStatus(heartLists);
JSONObject jSONObject=new JSONObject();
jSONObject.put("HeartStatusList",retHeartLists);
return JSONObject.toJSONString(jSONObject);
}
5、发布WebService
访问路径:项目地址/platform?wsdl,出现下图所示则说明WebService接口发布成功
6、访问WebService
6.1、创建WebServiceClientUtil工具类
public class WebServiceClientUtil {
private static Logger logger = LoggerFactory.getLogger(WebServiceClientUtil.class);
/**默认超时时间(秒)*/
private static final Integer DEFAULT_TIME_OUT = 90;
private static final Map<String, Client> CLIENT_MAP = new HashMap<>();
private static JaxWsDynamicClientFactory DCF = JaxWsDynamicClientFactory.newInstance();
public static Object[] webServiceClient(String wsUrl, String method, String requestXml, Integer timeout) {
return webServiceClient(wsUrl, method, new Object[] { requestXml }, timeout);
}
public static Object[] webServiceClient(String wsUrl, String method, Object[] methodParam, Integer timeout) {
try {
Client client = null;
if(CLIENT_MAP.containsKey(wsUrl)){
client = CLIENT_MAP.get(wsUrl);
}else{
client = DCF.createClient(wsUrl);
CLIENT_MAP.put(wsUrl, client);
}
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
if (timeout == null) {
// 连接超时时间
httpClientPolicy.setConnectionTimeout(DEFAULT_TIME_OUT * 1000);
// 响应超时
httpClientPolicy.setReceiveTimeout(DEFAULT_TIME_OUT * 1000);
} else {
// 连接超时时间
httpClientPolicy.setConnectionTimeout(timeout * 1000);
// 响应超时
httpClientPolicy.setReceiveTimeout(timeout * 1000);
}
// 取消块编码
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);
if (methodParam.length > 1) {
return client.invoke(method, methodParam);
} else {
return client.invoke(method, methodParam[0]);
}
} catch (Exception ex) {
logger.info("---调用WebService【" + wsUrl + "】服务失败..." + ex);
ex.printStackTrace();
throw new SystemException(SystemExceptionEnum.S30002, wsUrl, ex.getMessage());
}
}
public static Object[] webServiceClient(String wsUrl, String method, String requestXml) throws Exception {
return webServiceClient(wsUrl, method, requestXml, null);
}
public static String webServiceClientToString(String wsUrl, String method, String requestXml, Integer timeout) throws Exception {
Object[] object = webServiceClient(wsUrl, method, requestXml, timeout);
if (object.length > 0) {
return (String) object[0];
} else {
return null;
}
}
public static String webServiceClientToString(String wsUrl, String method, String requestXml) throws Exception {
Object[] object = webServiceClient(wsUrl, method, requestXml);
if (object.length > 0) {
return (String) object[0];
} else {
return null;
}
}
}
6.2、访问示例
public HeartStatus heartbeatCheck() {
String recXml = (String) WebServiceClientUtil.webServiceClient(webServiceUrl, method, sendXml, WS_TIMEOUT)[0];
logger.info(recXml);
HeartStatus heartStatusResult = JSONObject.parseObject(recXml, HeartStatus.class);
return heartStatusResult;
}
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊