java - 带有 Struts Filter 和 Tomcat 的 Spring Boot

标签 java spring-boot configuration struts2

我正在将 Struts2 应用程序迁移到 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 错误

There is no Action mapped for namespace [/clear] and action name [users] associated with context path [].

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 初始化为根应用程序上下文。因此您可以从 / 访问您的应用程序。

URL 由 Action 映射器映射到 Action 。默认 Action 映射器的实现位于 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

关于java - 带有 Struts Filter 和 Tomcat 的 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281436/

相关文章:

java - 在Java中使用selenium WebDriver查找具有继承元素的HTML元素的文本

java - 禁用/启用 OAuth2,无需两个安全配置

linux - Docker大使的局限性?其他 Docker 机器上的 Syslog 很快就满了

elasticsearch Transport-couchbase 插件拒绝端口 9091 上的连接

星型拓扑中的MySQL

java - 为什么 HashMap.java 中的常量 DEFAULT_INITIAL_CAPACITY 使用 1 << 4 而不是 16?

java - 具有相互依赖变量的组合优化

java - 连接到 glassFish 服务器上的 JNDI 时出现 NoInitialContextException

spring-boot - Spring Boot 指标 http.client.requests 不适用于 WebClient 响应式(Reactive)应用程序

java - 在bash环境中的Intellij IDE中启动spring boot