最近,我參與了一個項目,涉及應用程式從 Java 8 遷移到 Java 17 以及從 Spring 2.3.2 遷移到 3.2.2。此次升級在效能、安全性和長期支援方面帶來了顯著改進,但也帶來了由於 API 變更和棄用而帶來的挑戰。在這篇文章中,我將介紹我遇到的一些具體問題以及如何解決這些問題。
Java 17 是一個長期支援 (LTS) 版本,提供了多項新功能,例如密封類別、記錄和改進的垃圾收集,使其成為需要壽命和安全性的應用程式的理想選擇。 Spring 3.2.2 也進行了更新,支援最新的 Java 版本,增強了對反應式程式設計、安全性更新和其他最佳化的支援。
但是,過渡到這些版本涉及調整,特別是在庫和框架已轉移或棄用類別的情況下。
問題:
// Spring 2.x 中的舊程式碼
return new ResponseEntity<>(data, HttpStatus.OK);
解決方案:使用 HttpStatusCode,我們仍然可以存取相同的常數,但需要使用 HttpStatusCode.valueOf() 來實現相容性:
// 更新了 Spring 3.x 的程式碼
**`**return new ResponseEntity<>(data, HttpStatusCode.valueOf(200));**`**
或者,在可能的情況下,為了簡單起見,我將實例替換為 HttpStatusCode.OK。這個小小的改變對於
來說是必要的
與 Spring 3.x API 順利整合。
在測試期間,由於 Mockito 庫的更改,遷移暴露了模擬設定中的問題。用於在測試中定義符合條件的 Matcher 類別已移至 ArgumentMatchers。
問題:
// 使用 Mockito.Matcher
的舊程式碼
**Mockito.when(mockObject.method(Mockito.Matcher.any())).thenReturn(value);**
解決方案:現在應該使用 ArgumentMatchers 類別而不是 Matcher。我將 Mockito.Matcher 的所有實例更新為 Mockito.ArgumentMatchers,這解決了測試中的相容性問題。
// 使用 Mockito.ArgumentMatchers 更新程式碼
**Mockito.when(mockObject.method(Mockito.ArgumentMatchers.any())).thenReturn(value);**
Spring 3.x 的主要變化之一是從 javax 套件遷移到 jakarta。這項轉變影響了多個依賴項,尤其是與 Java EE 相關的依賴項,例如 javax.servlet 和 javax.persistence。
問題:
// 使用 javax 的舊程式碼
return new ResponseEntity<>(data, HttpStatus.OK);
解決方案:Spring 3.x 生態系統現在依賴 jakarta 套件。這需要對整個程式碼庫進行簡單但廣泛的重構,將 javax 導入替換為 jakarta 對應項。
// 使用 jakarta 更新程式碼
**`**return new ResponseEntity<>(data, HttpStatusCode.valueOf(200));**`**
更新導入非常耗時,但對於遷移來說是必要的。在進行進一步測試之前,我確保了與所有 jakarta 導入的兼容性,因為這會影響應用程式的多個層。
要點
這次遷移充滿挑戰,但 Java 17 和 Spring 3.x 的優勢讓一切變得值得。在處理 HttpStatusCode、ArgumentMatchers 以及 javax 到 jakarta 轉換等問題時,需要仔細規劃和程式碼調整,結果是一個更現代、更安全、更可維護的應用程式。
如果您打算進行類似的遷移,我建議您徹底查看 Java 和 Spring 的發行說明以預測變更。透過仔細的重構和廣泛的測試,您可以充分利用這些新版本的優勢。
以上是Java、Spring遷移的詳細內容。更多資訊請關注PHP中文網其他相關文章!