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 啟動和除錯您的 Boot 應用程式
  • 使用新的 STS Properties 編輯器編輯配置屬性。
  • 在您的程式碼中使用 @ConfigurationProperties,以便為您的自定義配置屬性獲得相同的編輯器支援。

建立 Boot 應用

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

menu-new-starter

Spring Boot 提供了所謂的“starter”。starter 是一組 classpath 依賴項,與 Spring Boot 自動配置結合使用,無需任何配置即可開始開發應用程式。我們選擇“web”starter,因為我們將構建一個簡單的“Hello”REST 服務。

new-starter-wizard

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

點選完成按鈕後,您的工作空間將看起來像這樣

workspace-ready

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

在 STS 中執行 Boot 應用

透過嚮導建立的 Spring Boot 應用有兩種打包方式:“jar”或“war”。Starter 嚮導允許您在其“packaging”選項中選擇其中一種。Spring Boot 的一個很棒的特性是,您可以輕鬆建立包含功能齊全嵌入式 Web 伺服器的獨立“jar”打包專案。要執行您的應用,您只需像執行任何其他普通 Java 應用程式一樣執行其 Java Main 型別即可。這是一個巨大的優勢,因為您不必費心設定本地或遠端 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”,可以透過 除錯執行 工具欄按鈕訪問

run-conf-menu

如果您在 Eclipse 中使用過 Java Launch Configuration Editor,這對您來說應該很熟悉。對於 Boot Launch Configuration,“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 提供了一個 重新啟動 工具欄按鈕專門用於此目的。點選該按鈕,正在執行的應用將被停止並重新啟動,您剛才對啟動配置所做的更改現已生效。如果成功,您現在應該在 https://:8888(而不是 8080)看到一個 404 錯誤頁面。(注意:如果您尚未啟動任何內容,“重新啟動”按鈕將不起作用,因為它依賴於您當前會話的啟動歷史記錄。但是,如果您已至少啟動過一次應用,則可以“重新啟動”已終止的應用)

編輯屬性檔案

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

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

props-editor

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

讓我們的應用更有趣

我們讓應用更有趣一些。以下是我們要做的事情:

  1. 建立一個返回“greeting”訊息的“Hello”REST 服務。
  2. 透過 Spring 屬性使 greeting 訊息可配置。
  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;
	}
}

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

使 Greeting 可配置

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

從 1.2.x 版本開始的一些 Spring Boot Jar 包包含特殊的 JSON 元資料檔案,編輯器會在您的專案 classpath 中查詢並解析這些檔案。這些檔案包含關於已知配置屬性的資訊。如果您稍微深入研究一下,可以在 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 在掃描 classpath 時能發現它並將其轉換為一個 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 並將 greeting 更改為其他內容。儘管我們已經具備在執行時正確定義屬性所需的一切,但您會注意到編輯器仍然不知道我們新建立的屬性

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)

hover-info

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

navigator

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

結束

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

獲取 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

保持領先

VMware 提供培訓和認證,助力您的職業發展。

瞭解更多

獲取支援

Tanzu Spring 透過一項簡單的訂閱,為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位制檔案。

瞭解更多

近期活動

檢視 Spring 社群的所有近期活動。

檢視全部