使用Spring Boot时,主控制器出现404错误

5
我正在尝试进行Spring MVC教程:
它要求你创建一个主控制器并启动一个Spring应用程序。当我运行Spring应用程序时,可以看到Tomcat服务器已启动,控制器类也按预期实例化了。然而,映射似乎失败了:@RequestMapping(“/greeting”)。当我尝试浏览http://localhost:8080/TestSpringOpenEMM2/greetinghttp://localhost:8080/TestSpringOpenEMM2/greeting时,总是返回404错误。 (TestSpringOpenEMM2是我的项目名称)。
我使用的是Eclipse IDE。
以下是我的文件:
package application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Application {

    public static void main(String[] args) {

        System.out.println("App starting" );
        SpringApplication.run(Application.class, args);
        System.out.println("App started" );
    }
}

控制器:

import javax.servlet.annotation.WebServlet;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


@Controller
public class GreetingController {



static{
    System.out.println("Static init GreetingController");



}




    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
        System.out.println("starting servlet (greeting)");

        model.addAttribute("name", name);
        return "greeting";
    }

    public GreetingController(){
        super();

        System.out.println("new GreetingController");
}
}

pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>TestSpringOpenEMM2</groupId>
  <artifactId>TestSpringOpenEMM2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>1.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>1.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.1.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-logging-juli</artifactId>
        <version>8.0.23</version>
    </dependency>
  </dependencies>
</project>

你尝试给你的控制器添加 @RequestMapping 注解了吗? - Paddyd
请确保您拥有正确的目录结构和拼写/大小写。根据我找到的链接,它说:“为了完成我们的应用程序,我们需要创建一个单独的Java文件。 Maven默认会编译src / main / java中的源代码,因此您需要创建该文件夹结构,然后添加名为src / main / java / Example.java的文件:”。 - jeffkempf
链接为http://docs.spring.io/spring-boot/docs/current/reference/html/getting-started-first-application.html - jeffkempf
@Paddyd 控制器是代码中当前 RequestMapping 注解所在的位置。 - A.D.
3个回答

4

也许您可以使用@RestController而不是@Controller。对于REST API,如果我使用@Controller,请求将导致404未找到错误,但当我将其更改为@RestController后,请求正常工作。


2
如果你提高Spring日志级别,它应该在Web应用程序启动时显示哪些URL映射到哪些类/方法。这可能有所帮助。
另外,如果你正在使用Eclipse,请右键单击项目->属性->Web项目设置->上下文根。确保它与你期望的一样,即TestSpringOpenEMM2。我见过很多这种情况(上下文根)在Eclipse中不如预期的例子。

上下文根路径与预期相符。 日志中提到: INFOS: 将过滤器 'characterEncodingFilter' 映射到:[/*] 当使用 --debug 参数启动应用程序时,我没有看到与 URL 相关的其他日志。 仍然无法访问 http://localhost:8080/greeting、http://localhost:8080/ 或者 http://localhost:8080/TestSpringOpenEMM2/greeting。 - A.D.

1

spring-boot-starter-parent是使用Spring Boot的好方式,因此可以使用类似于以下的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>TestSpringOpenEMM2</groupId>
  <artifactId>TestSpringOpenEMM2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.5.RELEASE</version>
  </parent>
  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
</project>

默认情况下,Spring Boot 使用内嵌的 Tomcat 容器,您只需要运行 main 方法。有关此主题的更多信息,请参阅 Spring Boot 文档

谢谢您的建议,一个起始父级如何简要地帮助解决这个问题? - A.D.
好的,它确实起作用了。 我按照链接docs.spring.io/spring-boot/docs/current/reference/html/进行了操作。 感谢您的建议。 - A.D.
不客气。通常Spring项目有很好的文档资料。 - Ali Dehghani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接