1. 程式人生 > >Q1:spring-boot中Controller路徑無法被訪問的問題

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

 

 

 

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

問題描述如下圖:

 

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

 

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

 

 

 這一大段大概就是指明瞭一個意思@[email protected][email protected][email protected]

@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所有子註解都有效。