Spring Tool Suite 3.6.4 中的 Spring Boot 支援

工程 | Kris De Volder | 2015 年 3 月 18 日 | ...

Spring Boot STS 教程

Spring Tool Suite 3.6.4 已於上週釋出。這篇部落格文章是一個教程,演示了 STS 為建立和使用 Spring Boot 應用程式提供的一些新功能。

在本教程中,您將學習如何

  • 使用 STS 建立一個簡單的 Spring Boot 應用程式
  • 從 STS 啟動和除錯您的引導應用程式
  • 使用新的 STS 屬性編輯器編輯配置屬性。
  • 在您的程式碼中使用 @ConfigurationProperties,以獲得對您自己的配置屬性的相同編輯器支援。

建立引導應用程式

我們使用“New Spring Starter”嚮導來建立一個基本的 Spring Boot 應用程式。

menu-new-starter

Spring Boot 提供了所謂的“啟動器”(starters)。啟動器是一組類路徑依賴項,它們與 Spring Boot 自動配置一起,使您無需進行任何配置即可開始開發應用程式。我們選擇“web”啟動器,因為我們將構建一個簡單的“Hello”REST 服務。

new-starter-wizard

該向導是一個 GUI 前端,它在底層使用 start.spring.io 的 Web 服務來生成一些基本的腳手架。您可以直接使用該 Web 服務,下載它生成的 zip 檔案,解壓,然後匯入等等。使用 STS 嚮導只需點選一個按鈕即可完成所有這些操作,並確保專案配置正確,以便您立即開始編碼。

點選完成按鈕後,您的工作區將如下所示:

workspace-ready

目前,由 start.spring.io 生成的 HelloBootApplication Java 主類是我們應用程式中唯一的程式碼。由於 Spring Boot 的“魔力”,並且我們向依賴項添加了“web”啟動器,這小段程式碼已經是一個功能齊全的 Web 伺服器了!它只是還沒有任何實際內容。在新增內容之前,讓我們學習如何執行應用程式,並驗證它確實正在執行。

在 STS 中執行 Boot 應用程式

透過嚮導建立的 Spring Boot 應用程式有兩種型別:“jar”或“war”。啟動器嚮導允許您在其“packaging”選項中選擇它們。Spring Boot 的一個很棒的功能是,您可以輕鬆建立包含功能齊全的嵌入式 Web 伺服器的獨立“jar”打包專案。執行您的應用程式所需的只是執行它的 Java Main 型別,就像執行任何其他普通 Java 應用程式一樣。這是一個巨大的優勢,因為您不必費心設定本地或遠端 Tomcat 伺服器、war 打包和部署。如果您真的想“走難路”,仍然可以選擇“war”打包。但是,確實沒有必要這樣做,因為

  1. 您可以隨時將 您的“jar”應用程式轉換為“war”應用程式
  2. Cloud Foundry 平臺直接 支援部署獨立的 Java 應用程式

注意:我們不會在這裡介紹如何將應用程式部署到 Cloud Foundry,但在 這篇文章中,您可以瞭解更多關於使用 Cloud Foundry Eclipse 直接從您的 IDE 進行部署的資訊。

現在,如果您理解了我剛才所說的,那麼您可能會意識到您實際上不需要 STS 的任何“特殊”工具來在本地執行應用程式。只需點選 Java Main 型別並選擇“Run As >> Java Application”,瞧!您所有的標準 Eclipse Java 除錯工具也將“正常工作”。然而,STS 提供了一個專用啟動器,它基本上做同樣的事情,但增加了一些有用的附加功能。所以讓我們改用它。

run-as-boot

您的應用程式應該會啟動,並且您應該在控制檯檢視中看到一些輸出

console-output

您可以在 https://:8080 上開啟在本地執行的應用程式。您將只得到一個 404 錯誤頁面,但這正是預期的,因為我們尚未嚮應用程式新增任何實際內容。

那麼,我承諾的附加功能是什麼呢?“Run As >> Boot App”基本上是一個普通的 Java 啟動器,但提供了一些額外的選項來自定義它建立的啟動配置。要檢視這些選項,我們需要開啟“Launch Configuration Editor”,可以透過 DebugRun 工具欄按鈕訪問

run-conf-menu

如果您在 Eclipse 中使用過 Java 啟動配置編輯器,這應該很熟悉。對於 Boot 啟動配置,“Main”選項卡有所不同,並有一些額外內容。我不會討論所有額外內容,您可以在 STS 3.6.4 釋出說明 中找到更多資訊。因此,讓我們只做一些簡單的事情,例如,將預設的 http 埠 8080 覆蓋為其他埠,例如 8888。您可能會猜到這可以透過設定系統屬性來完成。在“純”Java 啟動器中,您可以透過命令列引數設定此類屬性。但是,您可能想知道,該屬性的名稱究竟是“spring.port”、“http.port”、“spring.server.port”?幸運的是,啟動配置編輯器提供了幫助。Override Properties 表提供了一些基本的內容輔助。您只需鍵入“port”,它就會提供一些建議

override-property

選擇 server.port,在右側列中新增值 8888,然後單擊“Run”。

如果您嚴格按照步驟操作到這一點,您的啟動可能會立即因異常而終止

Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 31196; nested exception is: 

    java.net.BindException: Address already in use	   

這可能有點令人驚訝,因為我們剛剛更改了埠,不是嗎?實際上,這裡的埠衝突不是來自 http 埠,而是用於啟用“Live Bean Graph Support”的 JMX 埠(我不會在這篇部落格文章中討論此功能,請參閱 STS 3.6.4 釋出說明)。

我們可以採取一些措施來避免這個錯誤。我們可以再次開啟編輯器並更改 JMX 埠,或者我們可以停用“Live Bean Support”。但在此場景中,我們可能並不真正希望執行多個應用程式例項。因此,我們應該在啟動新例項之前停止已執行的例項。由於這是一個非常常見的操作,STS 提供了一個 Relaunch 工具欄按鈕,專門用於此目的。點選該按鈕,正在執行的應用程式將被停止並使用您剛剛對啟動配置所做的更改重新啟動。如果成功,您現在應該在 https://:8888 而不是 8080 看到一個 404 錯誤頁面。(注意:如果您尚未啟動任何內容,重新啟動按鈕將不起作用,因為它從您當前會話的啟動歷史記錄中工作。但是,如果您至少啟動過一次應用程式,則重新啟動已終止的應用程式是可以的。)

編輯屬性檔案

從啟動配置編輯器中覆蓋預設屬性值對於“快速覆蓋”很方便,但長期來看,依靠它來配置許多屬性和管理更復雜的配置可能不是一個好主意。為此,最好在屬性檔案中管理屬性,您可以將其提交到 SCM。啟動向導已經為我們方便地建立了一個空的 application.properties 檔案。

為了幫助您編輯 application.properties,STS 3.6.4 提供了一個全新的 Spring Properties Editor。該編輯器提供了出色的內容輔助和錯誤檢查功能

props-editor

上面的螢幕截圖顯示了對內容輔助和錯誤檢查的一些“修修補補”。目前對於我們非常簡單的“錯誤頁面應用程式”來說,唯一真正有意義的屬性是 server.port。嘗試更改屬性檔案中的埠,當您再次執行應用程式時,它應該會自動生效。但是請注意,啟動配置中覆蓋的屬性優先於 application.properties。因此,您必須取消選中或刪除啟動配置中的 server.port 屬性才能看到效果。

讓我們的應用程式更有趣

讓我們讓我們的應用程式更有趣。我們將做以下事情:

  1. 建立一個返回“問候”訊息的“Hello”REST 服務。
  2. 使問候訊息可透過 Spring 屬性配置。
  3. 設定專案,以便使用者定義的屬性獲得良好的編輯器支援。

建立一個簡單的 Hello Rest 服務

要建立 REST 服務,您可以遵循 本指南。但是,我們正在做一些更簡單、更直接的事情。

繼續建立一個包含此程式碼的控制器類

package demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

	@RequestMapping("/hello")
	public String hello(@RequestParam String name) {
		return "Hello "+name;
	}
}

透過重新啟動(Relaunch)您的應用程式來嘗試一下。URL https://:8888/hello?name=Kris 應該返回文字訊息“Hello Kris”。

使問候語可配置

這實際上很容易做到,您可能熟悉 Spring 的 @Value 註解。但是,使用 @Value 您將無法獲得良好的內容輔助。Spring Properties Editor 將不會知道您以這種方式定義的屬性。要理解為什麼,瞭解 Spring Properties Editor 如何獲取其關於已知屬性的資訊是很有用的。

從版本 1.2.x 開始的一些 Spring Boot Jar 包含特殊的 JSON 元資料檔案,編輯器會在您的專案類路徑中查詢並解析這些檔案。這些檔案包含有關已知配置屬性的資訊。如果您稍作深入,可以從 STS 中找到這些檔案。例如,開啟“spring-boot-autoconfigure-1.2.2.RELEASE.jar”(在“Maven Dependencies”下)並瀏覽到“META-INF/spring-configuration-metadata.json”。您會發現像 server.port 這樣的屬性在那裡有文件。

meta-data

為了讓編輯器識別我們自己定義的使用者屬性,我們必須建立這個元資料。幸運的是,只要您使用 Spring Boot @ConfigurationProperties 定義屬性,就可以輕鬆地自動化這個過程。因此,定義一個像這樣的類

package demo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("hello")
public class HelloProperties {

	/**
	 * Greeting message returned by the Hello Rest service.
	 */
	private String greeting = "Welcome ";

	public String getGreeting() {
		return greeting;
	}

	public void setGreeting(String greeting) {
		this.greeting = greeting;
	}
}

@ConfigurationProperties("hello") 告訴 Boot 查詢以 hello. 開頭的配置屬性,並嘗試將它們注入到 HelloProperties Bean 的相應 Bean 屬性中。@Component 註解標記此類,以便 Spring Boot 在掃描類路徑時會發現它並將其轉換為一個 Bean。因此,如果配置檔案(或另一個屬性源)包含屬性 hello.greeting,則該屬性的值將被注入到我們的 HelloProperties Bean 的 setGreeting 方法中。

現在,要實際使用此屬性,我們只需要對該 bean 的引用。例如,要自定義 REST 服務返回的訊息,我們可以向 HelloController 新增一個 @Autowired 欄位並呼叫其 getGreeting 方法

@RestController
public class HelloController {

	@Autowired
	HelloProperties props;
	
	@RequestMapping("/hello")
	public String hello(@RequestParam String name) {
		return props.getGreeting()+name;
	}
}

再次重新啟動您的應用程式,並嘗試訪問 https://:8888/hello?name=yourname。您應該會收到預設的“Welcome yourname”訊息。

現在繼續嘗試編輯 application.properties 並將問候語更改為其他內容。儘管我們已經具備了在執行時正確定義屬性的一切條件,但您會注意到編輯器仍然不知道我們新建立的屬性

unknown-prop

要使編輯器知道,仍然缺少 spring-configuration-metadata.json 檔案。此檔案是在構建時由 spring-boot-configuration-processor(一個 Java 註解處理器)建立的。我們必須將此處理器新增到我們的專案並確保它在專案構建期間執行。

將此新增到 pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

然後執行“Maven >> Update Project”以觸發專案配置更新。STS 提供的 Maven 專案配置器將配置 JDT APT 並激活 Eclipse 構建的處理器。警告將立即從編輯器中消失。您還將獲得正確的懸停資訊

hover-info

現在註解處理器已被啟用,將來對 HelloProperties 類的任何更改都將觸發 json 元資料的自動更新。您可以嘗試新增一些額外的屬性,或將 greeting 屬性重新命名為其他名稱。警告將適當地出現/消失。如果您好奇您的元資料檔案在哪裡,您可以在 target/classes/META-INF 中找到它。檔案在那裡,即使 Eclipse 盡力向您隱藏它。Eclipse 對專案輸出資料夾中的所有檔案都這樣做。但是,您可以使用 Navigator 檢視來繞過此問題,該檢視不會過濾太多檔案,並向您顯示工作區中實際資源的更直接檢視。透過“Window >> Show View >> Other >> Navigator”開啟此檢視

navigator

注意:我們知道新增處理器的手動步驟似乎是不必要的複雜化。我們計劃在未來 進一步自動化此過程

結束

希望您喜歡本教程。歡迎提出意見和問題。在另一篇即將釋出的文章中,我將向您展示 @ConfigurationProperties 的更高階用法以及 STS 屬性編輯器如何支援這些用法。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有