最近在做一個老舊工程的遷移,其中一個服務端接口是使用 WebService 做的,而且用的是 Axis1.4 這種老的不能再老的框架。經(jīng)過一番探索和研究,終于成功遷移到Springboot工程里,下面跟著我一步步操作。
Axis配置文件
Axis1.4 的入口配置文件是 server-config.wsdd
,在 resources 中創(chuàng)建一個 WEB-INF 文件夾,將配置文件拷貝到其中。
我們看一下配置文件的內(nèi)容:
< ?xml version="1.0" encoding="UTF-8"? >
< deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" >
< handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/ >
< handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/ >
< transport name="http" >
< requestFlow >
< handler type="URLMapper"/ >
< /requestFlow >
< /transport >
< transport name="local" >
< responseFlow >
< handler type="LocalResponder"/ >
< /responseFlow >
< /transport >
< !-- 示例接口 -- >
< service name="DemoService" provider="java:RPC" >
< parameter name="className" value="com.test.webservice.DemoService"/ >
< parameter name="allowedMethods" value="*"/ >
< /service >
< /deployment >
主要看最后一段:聲明了一個示例接口:服務名為DemoService
,映射的類為com.test.webservice.DemoService
,方法名為*
(通配符代表與類中的方法名一樣)
接口類
簡簡單單的一個接口類:
package com.test.webservice;
import org.springframework.stereotype.Component;
@Component
public class DemoService {
public String test() {
return "這是一個Axis1.4接口。";
}
}
我們?nèi)绾伟堰@個接口發(fā)布出去呢,接著往下看。
引入依賴
我這里用的是 gradle 構建的:
implementation('org.apache.axis:axis:1.4')
implementation('org.apache.axis:axis-jaxrpc:1.4')
implementation('axis:axis-wsdl4j:1.5.1')
implementation('commons-discovery:commons-discovery:0.5')
繼承AxisServlet
創(chuàng)建一個Servlet類,繼承AxisServlet:
package com.test.webservice.servlet;
import org.apache.axis.transport.http.AxisServlet;
import javax.servlet.annotation.WebServlet;
@WebServlet(
urlPatterns = "/axis-services/*",
loadOnStartup = 1,
name = "AxisServlet"
)
public class MyAxisServlet extends AxisServlet {
}
注意,Axis默認的過濾 url 是/services/
,而我這里將 urlPatterns 配置為/axis-services/
,是因為工程中同時使用了 Cxf框架 ,如果使用默認配置,會與 Cxf 沖突。
重寫Axis配置工廠
網(wǎng)上拷貝的配置工廠類:
package org.apache.axis.configuration;
import org.apache.axis.AxisProperties;
import org.apache.axis.ConfigurationException;
import org.apache.axis.EngineConfiguration;
import org.apache.axis.EngineConfigurationFactory;
import org.apache.axis.components.logger.LogFactory;
import org.apache.axis.server.AxisServer;
import org.apache.axis.utils.ClassUtils;
import org.apache.axis.utils.Messages;
import org.apache.commons.logging.Log;
import javax.servlet.ServletConfig;
import java.io.InputStream;
public class EngineConfigurationFactoryServlet extends EngineConfigurationFactoryDefault {
protected static Log log = LogFactory.getLog(EngineConfigurationFactoryServlet.class.getName());
private ServletConfig cfg;
public static EngineConfigurationFactory newFactory(Object param) {
return (param instanceof ServletConfig)
? new EngineConfigurationFactoryServlet((ServletConfig) param)
: null;
}
protected EngineConfigurationFactoryServlet(ServletConfig conf) {
super();
this.cfg = conf;
}
@Override
public EngineConfiguration getServerEngineConfig() {
return getServerEngineConfig(cfg);
}
private static EngineConfiguration getServerEngineConfig(ServletConfig cfg) {
String configFile = cfg.getInitParameter(OPTION_SERVER_CONFIG_FILE);
if (configFile == null) {
configFile =
AxisProperties.getProperty(OPTION_SERVER_CONFIG_FILE);
}
if (configFile == null) {
configFile = SERVER_CONFIG_FILE;
}
String appWebInfPath = "/WEB-INF";
//由于部署方式變更為jar部署,此處不可以使用改方式獲取路徑
// ServletContext ctx = cfg.getServletContext();
// String realWebInfPath = ctx.getRealPath(appWebInfPath);
FileProvider config = null;
String realWebInfPath = EngineConfigurationFactoryServlet.class.getResource(appWebInfPath).getPath();
InputStream iss = ClassUtils.getResourceAsStream(EngineConfigurationFactoryServlet.class, appWebInfPath + "/" + SERVER_CONFIG_FILE);
if (iss != null) {
config = new FileProvider(iss);
}
if (config == null) {
log.error(Messages.getMessage("servletEngineWebInfError03", ""));
}
if (config == null && realWebInfPath != null) {
try {
config = new FileProvider(realWebInfPath, configFile);
} catch (ConfigurationException e) {
log.error(Messages.getMessage("servletEngineWebInfError00"), e);
}
}
if (config == null) {
log.warn(Messages.getMessage("servletEngineWebInfWarn00"));
try {
InputStream is =
ClassUtils.getResourceAsStream(AxisServer.class,
SERVER_CONFIG_FILE);
config = new FileProvider(is);
} catch (Exception e) {
log.error(Messages.getMessage("servletEngineWebInfError02"), e);
}
}
return config;
}
}
有兩點需要注意:
- 這個配置類必須放在
org.apache.axis.configuration
包下,否則不生效,別問為什么,我也不知道... - 代碼中48行左右,
String appWebInfPath = "/WEB-INF";
指向的文件夾就是一開始創(chuàng)建的WEB-INF
最后一步
在啟動類加上注解 @ServletComponentScan
@SpringBootApplication
@ServletComponentScan
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
啟動程序,訪問 http://localhost:8080/axis-services
,會顯示已發(fā)布的 WebService 接口信息,示例接口地址為:http://localhost:8080/axis-services/DemoService?wsdl
。
-
接口
+關注
關注
33文章
8503瀏覽量
150840 -
文件
+關注
關注
1文章
561瀏覽量
24699 -
spring
+關注
關注
0文章
338瀏覽量
14311 -
服務端
+關注
關注
0文章
66瀏覽量
6987 -
SpringBoot
+關注
關注
0文章
173瀏覽量
169
發(fā)布評論請先 登錄
相關推薦
評論