我有一个班级
@Controller
@RequestMapping("/auth")
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String getLoginPage(@RequestParam(value="error", required=false) boolean error,
ModelMap model) {
}
}
的web.xml
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:META-INF/spring-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
appcontext.xml
<mvc:annotation-driven/>
<context:component-scan base-package="mysrc.src"/>
spring servlet.xml
<context:component-scan base-package="mysrc.src"/>
<mvc:annotation-driven/>
我得到的错误就像&#34;没有在调度员中发现映射等等等等#34;
但是现在我在控制台上看不出异常。
我只看到404
http://localhost:9090/app/auth/login
我在调试模式下将断点放在getLoginPage方法中但没有流量。
除了建议之外,我想问一下,我怎么能确定Spring已经扫描了一个已实现的@RequestMapping类?在启动控制台上搜索可能吗?
答案 0 :(得分:3)
通常当您从Spring获得404没有错误消息时,通常意味着您的应用程序部署在与您预期不同的上下文中。例如,您的代码示例表明您正在将Web应用程序部署到/,您确定要部署它吗?你在用tomcat吗?如果是这样,您的webapp应命名为ROOT.war。您能否提供更多详细信息,例如您在何处/如何部署您的webapp以及web.xml?
就你的映射而言,Spring将在INFO日志记录级别记录它扫描的控制器及其请求路径。如果调度程序servlet无法将您的请求与控制器匹配,则它将始终给您一条错误消息,因此没有错误消息指示您的请求不通过调度程序servlet。
答案 1 :(得分:1)
您的请求映射看起来正确。
您可以为控制器创建一个构造函数,并在其中放置一个日志语句或断点,以查看控制器是否由spring创建。
请注意,组件扫描也会初始化控制器两次(一次用于appcontext.xml,一次用于servlet.xml)。您应该添加过滤器以确保仅从servlet.xml创建控制器:
appcontext.xml(控制器除外):
<context:component-scan base-package="x.y.z">
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
</context:component-scan>
servlet.xml(仅限控制器):
<context:component-scan base-package="x.y.z" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
只是为了确定:base-package
的{{1}}属性必须是有效的java包,而不是src目录的路径(component-scan
看起来有点像你的src文件夹;-))