2017-08-26 297 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中;但後來我得到了錯誤 –