2017-08-26 240 views
1

我试图让我的头绕着弹簧MVC和启动超过一个星期了。 我理解它背后的理论,但不知何故我无法实现它的工作。 我知道白页错误问题已经被问了1000次,但是他们都使用web.xml来配置,我使用的是application.properties。mvc弹簧启动和自动配置

我创建了一个项目,首先,我的应用程序是我的控制器,我使用请求映射和响应主体来呈现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> 

我的PageController:

@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

对不起我的英语,但我的荷兰

回答

0

它看起来像你的控制器不加弹簧结构的顶部。 我看到一个裸体的注释

@ComponentScan 

正如你可以在它的Javadoc看到:

如果没有定义的特定 *包,将包中的 *类的声明出现这种情况扫描注解。

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

将一个构造函数添加到您的控制器类中,添加一个断点并在调试模式下启动该应用程序。如果没有在断点处停止,控制器不被实例化的春天....

您写道:

,但它们都使用一个web.xml配置,我用的是application.properties 。

web.xml用于配置servlet上下文。由于Java servlet版本3可以完全用Java来完成。 Spring为你做这件事,这就是为什么你不再需要web.xml的原因。

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

Finaly你可能有一个看看这个基本春天教程,它可能比你尝试过什么,所以更容易跟随...

希望我可以帮助你有点。

+0

谢谢Stefan。这很简单。我将我的控制器包移到我的应用程序的一个子目录中,现在它可以工作。我遵循一个基本的spring教程,但是他们在那里使用配置类来配置bean并且没有使用服务器,而是更多地依赖于依赖注入。感谢您的帮助 –

+0

不错,如果您将我的答案标记为正确,那就太好了! –

0

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

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

这里是一种文件夹结构,你应该哈瓦

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

将在这两个文件

package da.ny; 
+0

使用默认软件包I ment main/java。 –

+0

是的,就是这个问题。打包名称并使用它。 –

+0

这是我的文件夹结构:mvc/src/main/java/app/App.class mvc/src/main/java/controllers/PageController.class。我的application.propperties:mvc/src/main/resources。我试图把我的应用程序放在main/java中;但后来我得到了错误 –