【问题标题】:Spring boot with mvc and autoconfigured使用 mvc 和自动配置的 Spring Boot
【发布时间】:2017-08-26 10:51:52
【问题描述】:

我正在努力了解 Spring MVC 并启动了一个多星期。 我理解它背后的理论,但不知何故我无法让它发挥作用。 我知道白页错误问题已经被问过1000次了,但是都是用web.xml来配置的,我用application.properties。

我创建了一个项目,首先,我的应用程序是我的控制器,我在其中使用请求映射和响应主体来呈现 JSP 页面,即使对不同的 JSP 页面进行多次调用,效果也很好。但是当我尝试分离我的控制器并将它们放入控制器类时,我得到一个白标页面错误? 有人知道我做错了什么吗?

我完全按照教程进行操作,除了,他的主应用程序位于默认包中,我的应用程序位于打包应用程序中,因为我收到错误消息说我无法在基本包上执行组件,并且介于两者之间最后一个和我卡住的视频他覆盖了受保护的 SpringApplicationBuilder 方法配置,但是当我尝试覆盖它时,我收到一个警告,它不是超类的方法。他也从不解释消息的作用。

这是我的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>be.intecBrussel.danielDemesmaecker</groupId>
<artifactId>springMVC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
    <java.version>1.8</java.version>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.8.RELEASE</version>
</parent>

<build>
    <finalName>SpringMVC</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>required</scope>
    </dependency>
</dependencies>
</project>

我的页面控制器:

@Controller
public class PageController {

    @RequestMapping("/")
    String home(){
        return "home";
    }

    @RequestMapping("/about")
    String about(){
        return "about";
    }

    @RequestMapping("/contact")
    String contact(){
        return "contact";
    }
}

我的应用:

@EnableAutoConfiguration
@ComponentScan

public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

当她在没有控制器类的情况下仍在工作时我的应用程序:

@EnableAutoConfiguration
@Controller

public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }

    @RequestMapping("/")
    String home(){
        return "home";
    }

    @RequestMapping("/about")
    String about(){
        return "about";
    }

    @RequestMapping("/contact")
    String contact(){
        return "contact";
    }
}

我知道社区对为什么这不起作用等问题不满意,但我根本不知道问题出在哪里,所以不知道任何其他方式来问这个问题。所以任何人都可以帮助我理解为什么在将我的控制器移动到一个单独的类后会导致视图链接断开,这很好。 供参考:我正在使用本教程:http://courses.caveofprogramming.com/courses/spring-boot-tutorial/lectures/1063634

请原谅我的英语,但我是荷兰人

【问题讨论】:

    标签: java maven spring-mvc spring-boot


    【解决方案1】:

    您的控制器似乎未添加到 spring 配置中。 我看到一个裸注

    @ComponentScan
    

    正如您在其 javadoc 中看到的:

    如果具体 * 未定义包,扫描将从该包的包开始 * 声明此注解的类。

    因此,您需要将控制器放在与您的 App 类相同的或 ab 子包中,而不是应该找到它。

    向控制器类添加构造函数,在其中添加断点并以调试模式启动应用程序。如果没有停在断点处,说明控制器没有被spring实例化......

    你写的:

    但是他们都使用web.xml来配置,我使用application.properties。

    web.xml 用于配置 servlet 上下文。由于 java servlet 版本 3,这可以完全在 Java 中完成。 Spring 为您执行此操作,这就是您不再需要 web.xml 的原因。

    application.properties 用于配置 spring 和你自己的类。这与 web.xml 完全不同。

    最后你可以看看这个基本的 spring 教程,它可能比你目前尝试的更容易理解......

    希望能帮到你。

    【讨论】:

    • 谢谢斯特凡。就这么简单。我将我的控制器包移动到我的应用程序的子程序中,现在它可以工作了。我遵循了一个基本的spring教程,但是他们使用了一个配置类来配置bean并且没有使用服务器,它更多的是关于依赖注入。感谢您的帮助
    • 很好,如果您将我的答案标记为正确,那就太好了!
    【解决方案2】:

    包裹是主要问题。 @ComponentScan 获取包并搜索所有子包。例如,带有包com.dan.ny.App 的主类将在com.dan.ny.controllers.* 中查找。

    当您说默认包时,我假设您没有将包声明放在顶部。你需要这样做。它归结为java最佳实践。它不一定是一个好的包名,但你会喜欢在更大的应用程序中使用它。 Spring 需要将您的代码与类路径上的库中的代码区分开来。

    这是你应该拥有的那种文件夹结构

    mvc/src/main/java/da/ny/App.java
    mvc/src/main/java/da/ny/Controller.java
    

    放在两个文件的顶部

    package da.ny;
    

    【讨论】:

    • 使用 defaultpackage Iment main/java.
    • 是的,这就是问题所在。起一个包名并使用它。
    • 这是我的文件夹结构:mvc/src/main/java/app/App.class mvc/src/main/java/controllers/PageController.class。我的 application.properties:mvc/src/main/resources。我试图将我的应用程序放在 main/java 中;但后来我得到了错误
    • 添加文件夹结构来回答。您使用的是 Eclipse 或 Intellij 之类的 IDE 吗?任何非教程的 Java 开发都非常需要它们。另外,你应该考虑多复习一下java。
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2017-01-19
    • 2018-09-09
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多