Spring MVC报错No mapping for GET /app-name/secure/home排查求助
问题:访问/home端点时提示无映射报错
应用启动无报错、登录页面可正常使用,但用户登录后尝试访问home端点时程序崩溃,收到报错信息:
No mapping for GET /app-name/secure/home
JSP文件存放路径为WEB-INF/jsp/secure/home/view.jsp,以下是相关配置代码:
相关配置代码
Home控制器
@SecureController @RequestMapping("/home") public class HomeController { @Autowired public HomeController() { super(); } @ModelAttribute("userInformation") public SystemUserDetailsDto getUserDetails() { String username = UserInfoHolder.getUserInfo().getUsername(); return username; } @GetMapping public String handle() { return "home/view"; } }
DefaultSecureController实现
@SecureController @RequestMapping("/*") public class DefaultSecureController { private String servletContext = "secure/"; @RequestMapping public String handle(HttpServletRequest request) { return request.getRequestURI().substring(request.getRequestURI().lastIndexOf(servletContext) + servletContext.length()); } }
secure-servlet.xml
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.app.web.mvc"> <context:include-filter type="annotation" expression="com.app.web.mvc.SecureController" /> </context:component-scan> <mvc:annotation-driven /> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.app.application.core.userinfo.UserInfoInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.app.web.interceptor.SessionTimeoutInterceptor"> <!-- Preempt the default session timeout by 5 seconds to allow interceptor to work --> <property name="sessionMaxInactiveIntervalPreempt" value="5" /> <property name="timeoutMapping" value="/app/public/login?expired=true" /> </bean> </mvc:interceptor> </mvc:interceptors> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="2" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/secure/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="exceptionHandler" class="com.app.web.mvc.ExceptionHandler"> <property name="exceptionView" value="displayError" /> </bean> </beans>
web.xml中的Servlet配置
<servlet> <servlet-name>secure</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/secure-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>secure</servlet-name> <url-pattern>/secure/*</url-pattern> </servlet-mapping>
问题定位与解决
核心问题
报错的本质是DefaultSecureController的路径映射优先级高于HomeController,导致请求被兜底控制器拦截,而没有匹配到HomeController的/home路径:
secureServlet的映射是/secure/*,所有/secure/开头的请求都会进入该DispatcherServlet,此时控制器匹配的是/secure/之后的路径部分(即home)。DefaultSecureController的@RequestMapping("/*")会优先匹配所有单层级路径(包括home),直接覆盖了HomeController的/home映射。
修复步骤
调整DefaultSecureController的映射优先级
将其改为兜底映射,仅在没有其他控制器匹配时生效,修改代码如下:@SecureController public class DefaultSecureController { private String servletContext = "secure/"; @RequestMapping(value = "/**", method = {RequestMethod.GET, RequestMethod.POST}) public String handle(HttpServletRequest request) { String uri = request.getRequestURI(); int index = uri.lastIndexOf(servletContext); if (index != -1) { return uri.substring(index + servletContext.length()); } return "error"; // 兜底返回错误视图 } }/**的匹配优先级低于具体的/home,此时HomeController的映射会被优先匹配。验证视图路径正确性
HomeController返回的"home/view",结合视图解析器的前缀/WEB-INF/jsp/secure/和后缀.jsp,最终路径为/WEB-INF/jsp/secure/home/view.jsp,与你的JSP文件路径完全匹配,这部分无需修改。额外检查
确认登录后UserInfoHolder.getUserInfo()不会返回null,否则HomeController的getUserDetails方法会抛出空指针异常,导致请求处理失败。
内容的提问来源于stack exchange,提问作者dynamo
相关产品推荐
相关产品推荐

