1. 程式人生 > >用java啟動spring boot專案,模版目錄無法正常訪問

用java啟動spring boot專案,模版目錄無法正常訪問

背景描述

由於想快速在伺服器上部署一下spring boot的web應用,因此使用了java直接啟動spring boot內建tomcat的方式來構建服務,實際上這也是spring boot的一個很大的亮點。
但是接著就遇到了一個很有意思的問題,在專案中使用了Thymeleaf作為模版工具,使用執行jar包的方式進行專案啟動的時候,訪問頁面時出現了500錯誤,原因為找不到模版檔案。
然後這一切在本地開發的過程中並沒有出現,這就讓人非常摸不到頭腦了。

問題原因

後來經過查證和摸索後,想到了可能會不會是在controller對映的時候,使用了錯誤的對映地址呢?因為我在配置模版的時候是這麼寫的

# Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.prefix=classpath:/templates/

而我在controller裡面有的頁面寫成了這樣的,注意這裡的return值,在路徑的最前面加了"/"

@RequestMapping("/admin/index")
private String adminIndex(ModelMap map){
    //TODO something
    return "/admin/index";
}

經過嘗試修改之後,將多餘的"/"去掉之後,一切就正常了。

因此這就非常有意思了,為什麼同樣的程式碼,我開發啟動的時候就沒有問題,但是使用jar啟動的時候就會有這個問題呢。
對比了一下我通過使用mvn spring-boot:run啟動服務和使用java -jar xx.jar啟動服務時候的日誌差異,發現前者使用的是target下面的classes檔案下下面的內容,實際上在啟動中嘗試替換了檔案下下面的靜態檔案也確實生效了。而後者則是使用了jar包這個Archive下面的classes檔案。

2016-07-07 14:44:21  [ main:0 ] - [ INFO ]  Starting Application on Lenovo-PC with PID 4320 (G:\java_workspace\xxx\target\classes started by zhf in G:\java_workspace\xxx)
2016-07-07 14:44:21  [ main:32 ] - [ DEBUG ]  Running with Spring Boot v1.3.2.RELEASE, Spring v4.2.4.RELEASE
[INFO ] 2016-07-07 14:50:55,844
method:org.springframework.boot.StartupInfoLogger.logStarting(StartupInfoLogger.java:48) Starting Application v1.0.0-SNAPSHOT on Lenovo-PC with PID 8472 (G:\java_workspace\xxx\target\WebSite-1.0.0-SNAPSHOT.jar started by zhf in G:\java_workspace\xxx\target) [DEBUG] 2016-07-07 14:50:55,849 method:org.springframework.boot.StartupInfoLogger.logStarting(StartupInfoLogger.java:51) Running with Spring Boot v1.3.2.RELEASE, Spring v4.2.4.RELEASE

但造成這兩者的具體差異,還需要之後進一步分析研究才能知道,目前先記錄下這個問題,之後有時間了再進一步進行探索。