【问题标题】:Spring: requests do not reach controllerSpring:请求未到达控制器
【发布时间】:2014-05-06 12:16:04
【问题描述】:

我正在使用 Spring 3.2 版开发我的第一个应用程序。

似乎我已经检查了很多次,但是在尝试获取 localhost:8080/MakeAwayTickets/ 或 localhost:8080/MakeAwayTickets/index 时我只收到 404。控制器甚至没有被加载,因为我没有看到它的构造函数的任何输出。

但是,正在加载 css 和 js 目录下的文件,例如 localhost:8080/MakeAwayTickets/css/dashboard.css。

日志包含以下内容:

2014-05-06T15:56:33.031+0400|INFO: visiting unvisited references
2014-05-06T15:56:33.446+0400|INFO: WebModule[null] ServletContext.log():No Spring WebApplicationInitializer types detected on classpath
2014-05-06T15:56:33.783+0400|SEVERE: log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment).
2014-05-06T15:56:33.783+0400|SEVERE: log4j:WARN Please initialize the log4j system properly.
2014-05-06T15:56:34.013+0400|INFO: WebModule[null] ServletContext.log():Initializing Spring FrameworkServlet 'appServlet'
2014-05-06T15:56:35.017+0400|INFO: Loading application [MakeAwayTickets] at [/MakeAwayTickets]
2014-05-06T15:56:35.081+0400|INFO: MakeAwayTickets was successfully deployed in 6,888 milliseconds.

我在配置中有以下内容:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>MakeAwayTickets</display-name>
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/config/root-context.xml
    </param-value>
</context-param>

<filter>
    <filter-name>charsetFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

servlet-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:beans="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <annotation-driven />

    <resources mapping="/css/**" location="/css/" />
    <resources mapping="/bootstrap/**" location="/bootstrap-3.1.1-dist/" />

    <beans:bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/pages/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:annotation-config />
    <context:component-scan base-package="org.badcoding.spring.controller" />
</beans:beans>

这里是控制器类:

package org.badcoding.spring.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.badcoding.dao.interfaces.TicketsDAO;
import org.badcoding.spring.form.IndexSearch;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class IndexController {

    public IndexController() {
        System.out.println("here");
    }

    // @Autowired
    // private TicketsDAO ticketsDAO;

    @RequestMapping("/index")
    public String index() {
        return "index";
    }

    @RequestMapping("/")
    public String root() {
        return "redirect:/index";
    }

    @RequestMapping(value = "/index_search", method = RequestMethod.GET, headers="myHeader=myValue")
    public String list_flights(@PathVariable String city_out, @PathVariable String city_in, @PathVariable String company, @PathVariable String date0, @PathVariable String date1, Model model) {
        model.addAttribute("integer", 666); 

        return "index_search";
    }
}

我真的需要这方面的帮助。

更新: 添加后

<beans:bean class="org.badcoding.spring.controller.IndexController"/>

我收到 ClassNotFoundException 的 servlet 配置。

【问题讨论】:

  • 如果在@RequestMapping("/index") 之后添加@ResponseBody 会发生什么情况。有用吗?
  • /WEB-INF/pages/下是否存在index.jsp?
  • @geo 不,没有变化。
  • 如果您刚开始使用 Spring,我强烈建议 (1) 使用当前版本 (4.0),(2) 使用基于 Java 的配置而不是 XML,以及 (3) 使用 Spring引导以处理所有标准配置和接线,同时学习如何使用控制器和其他特定于应用程序的工具。
  • projects.spring.io/spring-boot 有一些入门指南。请注意,如果您开始使用 Spring 等主要 Java 组件,则需要使用为您管理依赖项的构建工具,例如 Maven 或 Gradle。他们中的任何一个都知道如何解析、下载和附加任何已发布的 Spring 发布版本。

标签: java spring spring-mvc


【解决方案1】:

1.尝试从您的配置文件中删除以下代码

<context:annotation-config />

2.并检查此&lt;annotation-driven /&gt;,因为您的配置文件中来自正确的xsd,例如&lt;mvc:annotation-driven /&gt;

3.尝试将此代码添加到控制器类中

 @RequestMapping(value = "/index", method = RequestMethod.GET)
public String index() {
        return "index";
    }

【讨论】:

  • 1.完毕。 2. 我将 xmlns= 更改为 xmlns:mvc= 并在三个标签中添加了 mvc: 前缀。你是这个意思吗? 3. 也完成了,作为附加方法和现有 index() 的替代品。不过,我没有看到任何变化。而且,顺便说一句,如果请求到达控制器但它找不到它们的映射,我不会在日志中看到一些通知吗?
  • 好像没有。
【解决方案2】:

我遇到了同样的问题,发现了这个问题。

虽然我正在以编程方式进行配置,但找不到控制器的问题是因为我有 @ComponentScan("com.ables.books.model")。

当然控制器不在那个包中,所以它们永远不会被发现。

我已将其更改为 @ComponentScan("com.ables.books") 以便我的带有 @Controller 的类可以在任何地方找到。 xml 中 @ComponentScan 的等价物是 context:annotation-config 所以只需检查你传递给它的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多