【问题标题】:Invalid controller configuration at Spring MVC 4Spring MVC 4 中的控制器配置无效
【发布时间】:2015-06-25 04:42:37
【问题描述】:

我是 Spring 框架的新手。我想开发一个简单的 web 应用程序,它显示基于 url“/greeting.html”的 hello.jsp 内容。但现在,它给了我 404 错误。我做错了什么?

这里是我的项目的 github repo(这个项目是在 Eclipse STS 下创建的):https://github.com/terancet/EventTracker

这是我的 HelloController 类

@Controller
public class HelloController {
    @RequestMapping(value = "/greeting")
    public String sayHello(Model model) {
        model.addAttribute("greeting", "Hello World");

        return "hello.jsp";
    }

}

这里是 web.xml

<servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>


        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.pluralsight.WebConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

这是一个项目结构:

【问题讨论】:

  • 你能不能把@RequestMapping(value = "/greeting")换成@RequestMapping(value = "/greeting.html")试试?
  • 你点击的完整网址是什么?
  • 我的完整网址 - localhost:8080/EvenTracker/greeting.html 。我已替换为“/greeting.html”,但仍然出现 404 错误。
  • 你能在这里添加你的jsp控制器调用吗
  • 我已经更新了回购链接:github.com/terancet/EventTracker

标签: spring spring-mvc spring-webflow spring-mvc-test spring-web


【解决方案1】:

将 log4j.xml 或 log4j.properties 添加到

src/main/资源

文件夹(将自动检测到)。 然后,当您启动服务器时,它会通过信息日志告诉您控制器的 url 映射的确切位置。这一点很重要,不仅要验证映射 url,还要确保它确实被映射:

此外,如果您在 STS/Eclipse 中:

right click on the project -> click properties -> click select 'Web Project Settings' 

默认情况下,这是派生 url 路径的位置。因此,如果其中的上下文根值是:“EventTracker”,那么您的完整 url 请求将是(假设设置了“.jsp”后缀,正如其他人在您的解析器中所指出的那样):

http://localhost/EventTracker/greetings

来自我的 1 个项目的 log4j.xml 示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="%-5p:%d{yyyyMMdd HH:mm:ss} %t %c - %m%n"/>
        </layout>
    </appender>

    <appender name="fileAppender" class="org.apache.log4j.FileAppender">
       <param name="File" value="c:/tmp/my-app.log"/>
       <param name="MaxFileSize" value="10MB"/>
       <param name="MaxBackupIndex" value="50"/>

       <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p:%d{yyyyMMdd HH:mm:ss} %t %c - %m%n" />
        </layout>
    </appender>

    <!-- 3rdparty Loggers -->
    <logger name="org.springframework.core">
        <level value="info" />
    </logger>

    <logger name="org.springframework.beans">
        <level value="info" />
    </logger>

    <logger name="org.springframework.context">
        <level value="info" />
    </logger>

    <logger name="org.springframework.web">
        <level value="debug" />
    </logger>

    <logger name="org.springframework.webflow">
        <level value="debug" />
    </logger> 


    <!-- Root Logger -->
    <root>
        <priority value="info" />
        <appender-ref ref="console" />
        <appender-ref ref="fileAppender"/>
    </root>


</log4j:configuration> 

日志信息:

INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/userManagement/getUser],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.assessme.com.entity.User org.assessme.com.controller.UserManagementController.data(java.util.Locale,org.springframework.ui.Model)

【讨论】:

  • 感谢您的提示(关于 log4j)。我向控制台做了一个简单的输出,它抱怨我没有控制器可以在调度程序处请求映射。但是,我已经通过 @Request 注释进行了显式映射。如何解决这个问题?
【解决方案2】:

在您的WebConfig 中,您有以下内容

@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();

    resolver.setPrefix("/WEB-INF/jsp/");
    resolver.setSuffix(".jsp");

    return resolver;
}

您的控制器正在返回hello.jp。这被传递给InternalResourceViewResolver 以解析为视图。它将创建 /WEB-INF/jsp/hello.jsp.jsp 的路径,然后转发到该路径。

首先让你的控制器返回hello而不是hello.jsp。其次,在WEB-INF 目录中创建一个jsp 目录并将您的hello.jsp 移动到那里。第三次重启。

【讨论】:

  • 感谢您的评论。按照您的建议进行了更正,但仍然在访问以下 url 路径时收到 404 错误:localhost:8080/EventTracker/greeting.html
  • 您的应用程序是如何部署的?作为根,即//EventTracker。 URL 也区分大小写...此外,您在此处发布的内容与您在使用 Spring Boot 的存储库中的内容不匹配...旁边它还使用 forward: 而不是返回视图名称。因此,不确定您在此处发布的内容,但与您链接的内容不匹配。 (最好你应该在问题中包含所有内容,而不是让人们通过 github 搜索信息)。
【解决方案3】:

这可能是应用程序名称中的拼写错误。请尝试 localhost:8080/EventTracker/greeting - EventTracker with Event

并尝试将 url-pattern 更改为 /*

【讨论】:

  • 但是,如果我改为 /* 所有的 get 请求都会被映射到 hello.jsp。
  • 试图这样做但没有帮助。当我输入以下网址时:localhost:8080/EventTracker/greeting.html 出现 404 错误...
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
相关资源
最近更新 更多