为什么对 Spring MVC 控制器的请求会转到 Struts Dispatcher?

问题描述 投票:0回答:2

我配置了 Struts 2 和 Spring MVC。我的

web.xml
如下所示:

web.xml
:

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>springmvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>springmvc-dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-dispatcher-servlet.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
<filter-name>jsonpCallbackFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
 
<filter-mapping>
<filter-name>jsonpCallbackFilter</filter-name>
<url-pattern>*.json</url-pattern>
</filter-mapping>

当我点击 REST URL 上传文件时,它会调用 Struts Dispatcher 而不是 Spring。

为什么 URL

/rest/uploadfile/iec9.pdf
会转到 Struts Dispatcher?

java spring spring-mvc configuration struts2
2个回答
3
投票

您的 spring MVC 调度程序 servlet 映射到由 Struts 过滤器处理的 URL 子集。就过滤器在任何其他 servlet 之前调用而言,它将具有优先权。要解决此问题,您需要配置 Struts 以从映射中排除某些 URL。

<struts>
    <constant name="struts.action.excludePattern" value="/rest/?.*"/>
    ...

</struts>  

1
投票

补充Roman的答案,在同一个项目中配置Struts和Spring MVC时,通常使用struts排除过滤器。当请求发出时,Struts 会尝试处理该请求,当排除时,Spring MVC 将接管并处理该请求。值得注意的是,Struts 排除过滤器可以放在属性文件中,例如 struts.properties。通常可以在此处使用正则表达式来排除常见短语(例如,如果类中的所有操作或控制器共享一个公共部分,则可以使用正则表达式排除所有操作或控制器)。

© www.soinside.com 2019 - 2024. All rights reserved.