Q1:spring-boot中Controller路徑無法被訪問的問題


 

 

 

在學習spring-boot入門的第一個例子就是spring-boot-web的一個在頁面上輸出hello-world的例子,在運行這個例子的時候我遇到了下面這個簡單的問題,但是第一次解決還是花了我很長的時間,記錄一下。

問題描述如下圖:

 

我有三個Controller,一個是將主類當成第一個Controller;第二個Controller在主類所在的子目錄下,就是TestController;第三個Controller是捕魚主類在同一個包下的OutOfRangeController。而主類的配置只有一個@SpringBootApplication。但是在瀏覽器進行訪問的時候卻出現了第一第二個Controller可以訪問的到,而第三個OutOfRangeController訪問不到的問題,如下圖所示:

 

而出現這種情況的原因在於@SpringBootApplication。下圖是官方給出的注解使用說明:

 

 

 這一大段大概就是指明了一個意思@SpringBootApplication=@EnableAutoConfiguration+@ComponentScan+@Configuration

@Configuration:該注解將類可以看成配置文件,通常和@Bean配合使用

@EnableAutoConfiguration:在程序啟動時自動加載配置

@ComponentScan:會自動掃描指定包下的全部標有@Component的類,並注冊成bean,當然包括@Component下的子注解@Service,@Repository,@Controller。

我們需要關注的就是@ComponentScan,下面是官方給出的一段對於@ComponentScan的介紹

大概意思是說,如果代碼結構按照被建議的那樣,將主類放在根目錄下,那么只需要配置一個@ComponentScan,無需添加任何參數。而這一句就解釋了我們自己編寫的第一個和第二個Controller為什么會被加載,而第三個OutOfRangeController無法被加載,因為第三個OutOfRangeController和主類不再同一個目錄下,無法被自動加載,所以需要我們去手動加載。於是我在主類上手動添加了一條@ComponentScan,將第三個OutOfRangeController所在的路徑進行添加,如下圖所示

啟動工程發現雖然第三個OutOfRangeController可以訪問了,但是TestController無法正常訪問

 

 說明自己配置的@ComponentScan覆蓋了@SpringBootApplication中的@ComponentScan,但是由於@SpringBootApplication還有另外兩個標簽,所以在主類中配置的Controller還是好使的,但是在其子包下的配置都不好使了,無法被自動搜索到。

 

所以在配置@ComponentScan時,推薦以下兩種配置,第一種是將根路徑作為參數,第二種是多配置幾個路徑,如下圖所示

 

以上不僅是對Controller配置有效,推廣來看應該是對@Component所有子注解都有效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM