我正在将 Struts 2 应用程序迁移到 Spring Boot。我在我的应用程序启动类中定义了
StrutsPrepareAndExecuteFilter
。
@SpringBootApplication
public class ClearApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(ClearApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ClearApplication.class);
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
Collection<String> urlPatterns = new ArrayList<>();
urlPatterns.add("/*");
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
StrutsPrepareAndExecuteFilter struts = new StrutsPrepareAndExecuteFilter();
registrationBean.setFilter(struts);
registrationBean.setName("strutsFilter");
registrationBean.setOrder(1);
registrationBean.setUrlPatterns(urlPatterns);
return registrationBean;
}
}
pom.xml
文件配置如下
<groupId>com.study.pack</groupId>
<artifactId>clear</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>clear</name>
<description>Demo project for Spring Boot</description>
我的操作类有一个简单的 Struts 操作和另一个 JSON 操作
@Action(value = "welcome", results = { @Result(name = "success", location = "result.jsp") })
public String execute() {
return "success";
}
@Action(value = "users", results = { @Result(name = "success", type = "json", params = { "root", "userList" }) })
public String users() {
userList = new ArrayList<>();
userList.add(new User("Carl", "15", "M"));
userList.add(new User("Rick", "30", "M"));
userList.add(new User("Michonne", "26", "F"));
return "success";
}
当我在本地 Tomcat 服务器上部署应用程序时,我可以访问操作 URL:
http://localhost:8080/clear/welcome
http://localhost:8080/clear/users
但是,当我在 STS 中运行应用程序(或使用 Maven 命令)时,访问上述相同的 URL 时会收到标准 Struts 错误:
没有为与上下文路径 [] 关联的名称空间 [/clear] 和操作名称 [user] 映射的操作。
application.properties
具有以下属性:
server.contextPath=/clear
server.port=8080
我是否缺少任何其他配置才能使其正常工作?
更新:
按照@Roman-C的建议,我检查了Tomcat服务器的启动日志,上下文路径是相同的。
外部 Tomcat 服务器:
[ost-startStop-1] o.a.c.c.C.[.[localhost].[/clear] : Initializing Spring embedded WebApplicationContext
嵌入式Tomcat服务器:
[ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/clear] : Initializing Spring embedded WebApplicationContext
application.properties
位于文件夹内
src/main/resources
仍然没有运气。我猜不知何故,Struts 注释被忽略了。
我已将源代码提交到GitHub。
默认情况下,Spring Boot 将嵌入式 tomcat 初始化为根应用程序上下文。因此您可以从
/
访问您的申请。
DefaultActionMapper
中,它解析 URL 并提取操作名称和命名空间。上下文路径之后的最后一个斜杠之前的路径是命名空间,操作名称是剩余路径。
application.properties
server.contextPath=/clear
server.port=8080
如果它们位于使用 Maven 项目结构的
src/main/resources
中,则可以正常工作。
检查应包含以下行的日志消息
INFO 4496 --- [ost-startStop-1] o.a.c.c.C.[.[localhost].[/clear] : Initializing Spring embedded WebApplicationContext