如何使用Spring Boot,Spring Data和H2 DB實現REST API

Tybyq發表於2018-11-16

在本文中,我們將討論Kotlin。 我在Kotlin中使用Spring Boot,Spring Data和H2記憶體資料庫開發了一個非常簡單的REST API。

Kotlin和Spring Boot很好地協同工作。

您將在程式碼演練部分中注意到專案中沒有控制器和NO服務類。 這是Spring的魔力,   @RepositoryRestResource 下面將進一步解釋。

我沒有Kotlin的經驗,但我在GitHub專案中閱讀和看到的Kotlin程式碼絕對值得探索。

您可能會問的一個重要問題是:為什麼Kotlin?

為何選擇Kotlin? 

  • Kotlin編譯為位元組碼,因此它可以像Java一樣執行。

  • Kotlin比Java更簡潔。

  • Kotlin的類比   Data   Java的 value   更簡潔  

  • 預設情況下,類是final,對應於Effective Java Item 17 -  如果要使類可繼承,則 需要顯式   開啟 

  • 預設情況下,抽象類是開啟的。

  • Kotlin的一個關鍵特性是null-safety,它在編譯時乾淨地處理空值,而不是 NullPointerException  在執行時 碰到著名   的。 

  • 主建構函式與輔助建構函式 - 如果您需要多個建構函式,那麼只有您可以使用輔助建構函式。 否則,大多數Kotlin類都會有一個主建構函式。

  • Kotlin也可以用作指令碼語言。

  • Kotlin和Java是可互操作的,所以很容易在程式碼庫的一小部分上試用Kotlin。

  • Kotlin使用積極型別推斷來確定未宣告型別的值和表示式的型別。 這減少了相對於Java的語言冗長度。

  • Google完全支援Kotlin與他們的Android作業系統一起使用。

以下兩點參考維基百科:

  • “根據JetBrains的部落格,Kotlin被亞馬遜網路服務,Pinterest,Coursera,Netflix,Uber和其他公司使用.Corda是由知名銀行財團(如高盛,富國銀行,摩根大通)開發的分散式賬本,德意志銀行,瑞士銀行,匯豐銀行,法國巴黎銀行,法國興業銀行(SociétéGénérale),其程式碼庫中有超過90%的Kotlin。“

  • 根據谷歌的說法,Kotlin已被幾家主要開發商採用 - 例如Expedia,Flipboard,Pinterest,Square等 - 用於他們的Android製作應用程式。

程式碼演練

這個例子的專案程式碼可以在我的 Kotlin Github Repo 上找到 ,演示了一個使用Kotlin和Spring Boot的簡單REST API  

克隆   - .git

  • 科特林

  • 春季啟動

  • 春季資料

  • H2記憶體資料庫

  • 搖籃

瞭解build.gradle

如何使用Spring Boot,Spring Data和H2 DB實現REST API


  org.jetbrains.kotlin:kotlin-gradle-plugin    編譯Kotlin源和模組。

  org.jetbrains.kotlin:kotlin-allopen  - 這是他有趣的部分。 在Kotlin中,預設情況下,所有課程都是   最終的 。 
現在,為了使類可繼承,您必須使用open關鍵字進行批註。 而且,問題在於許多其他庫,如Spring,測試庫(Mockito等),這需要類和方法成為非最終的。 在Spring中,這些類主要包括   @Configuration   類和   @Bean   方法。

這裡的規則很簡單;  你需要註釋   @Configuration   和   @Bean   方法來標記它們是開放的,但這種方法很乏味且容易出錯,因此Kotlin提出了編譯器外掛,透過這種依賴使用 自動化這個過程   org.jetbrains.kotlin:kotlin-noarg       
  apply plugin: 'kotlin-jpa'

為了能夠使用Kotlin不可變類,我們需要啟用Kotlin JPA外掛。 它將為任何使用@Entity註釋的類生成no-arg建構函式,   apply plugin: 'kotlin'.

要定位JVM,需要應用Kotlin外掛:   apply plugin: 'kotlin-spring' 這是Spring Kotlin整合所必需的

編譯器選項

Spring可空性註釋為整個Spring API提供了對Kotlin開發人員的null安全性,具有在編譯時處理與null相關的問題的優勢。 可以透過  -Xjsr305   使用strict選項 新增 編譯器標誌 來啟用此功能   並且,它還配置Kotlin編譯器以生成Java 8位元組碼。

compileKotlin {
kotlinOptions {
freeCompilerArgs  = [ “ -  Xjsr305 = strict” ]
jvmTarget  =  “1.8”
}
}


compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")  我 是Kotlin標準庫的Java 8變體。

compile('com.fasterxml.jackson.module:jackson-module-kotlin')  一個 用於科特林和資料類的序列化/反序列化DDS支援。

compile("org.jetbrains.kotlin:kotlin-reflect")  我 是Kotlin反射庫。

Spring Boot Gradle外掛自動使用Kotlin Gradle外掛上宣告的Kotlin版本,因此未在依賴項部分明確定義該版本。

所有剩餘的條目都是不言自明的。

Kotlin程式碼

Spring Boot應用程式

/src/main/kotlin/com.xp.springboot.kotlin.SpringBootKotlinRestApiApplication.kt  

注意上面缺少的分號。 只有擁有@ Bean時才需要開啟和關閉類的大括號。否則,需要一個類   name   。  Runapplication   是一個頂級的功能。

如何使用Spring Boot,Spring Data和H2 DB實現REST API

建立資料類

然後,我們透過使用科特林資料類,其目的是為了儲存資料,並自動提供建立我們的模型 equals() hashCode() toString() ,   componentN()   功能,和 copy()

此外,您可以在同一資料類中定義多個實體。   Var   類似於一般變數,在Kotlin中被稱為可變變數,可以多次分配。

還有另一種型別:   val   類似於常量變數,在Kotlin中被稱為不可變的,只能初始化一次。 此外,它   val   是隻讀的,您不能顯式寫入   val

如何使用Spring Boot,Spring Data和H2 DB實現REST API

建立儲存庫

是的,只有一個單行程式來定義Spring Data curd儲存庫的儲存庫介面。 這裡有趣的Spring註釋是   RepositoryRestResource 這是透過新增   spring-boot-starter-data-rest  依賴項來實現的。

如何使用Spring Boot,Spring Data和H2 DB實現REST API

如果你注意到,   沒有控制器,也沒有服務。  此專案在啟用HATEOAS的情況下公開以下REST端點。

  GET  -   http:// localhost:8080 / parkrun / runners

  POST   - http:// localhost:8080 / parkrun / runners

  GET   - http:// localhost:8080 / parkrun / runners / 2

  DELETE   - http:// localhost:8080 / parkrun / runners / 1

這是神奇的 @RepositoryRestResource

應用於 collectionResourceRel   定義自定義資源標籤,否則,註釋將根據模型類名稱( /parkRunners 使用預設值

在執行時,Spring Data REST    將自動建立此介面的實現。 然後,它將使用   @RepositoryRestResource   註釋來指導Spring MVC並在其中建立RESTful端點    /parkRunners

執行應用程式

在Gradle clean build之後準備好jar後,使用以下命令執行應用程式:    java -jar SpringBootKotlinRestAPI-0.0.1-SNAPSHOT.jar   並點選 GET上 的URL  以下是對響應的看法:      

{
    “_links”:{
        “跑步者”:{
            “href”:“http:// localhost:8080 / parkrun / runners”
        },
        “個人資料”:{
            “href”:“http:// localhost:8080 / parkrun / profile”
        }
    }

}


/runners    在GET上 點選URL   

這是你的回答:

{
   “_embedded”:{
      “跑步者”:[
         {
            “firstName”:“NEERAJ”,
            “lastName”:“SIDHAYE”,
            “性別”:“M”,
            “runningClub”:“RUNWAY”,
            “totalRuns”:“170”,
            “_links”:{
               “自我”:{
                  “href”:“http:// localhost:8080 / parkrun / runners / 1”
               },
               “parkRunner”:{
                  “href”:“http:// localhost:8080 / parkrun / runners / 1”
               }
            }
         }
      ]
   },
   “_links”:{
      “自我”:{
         “href”:“http:// localhost:8080 / parkrun / runners”
      },
      “個人資料”:{
         “href”:“http:// localhost:8080 / parkrun / profile / runners”
      }
   }
}


接下來,選擇配置檔案URL並檢視您使用的內容   /profile/runners

{
   “阿爾卑斯山”:{
      “版本”:“1.0”,
      “描述符”:[
         {
            “id”:“parkRunner-representation”,
            “href”:“http:// localhost:8080 / parkrun / profile / runners”,
            “描述符”:[
               {
                  “name”:“firstName”,
                  “type”:“SEMANTIC”
               },
               {
                  “name”:“lastName”,
                  “type”:“SEMANTIC”
               },
               {
                  “名字”:“性別”,
                  “type”:“SEMANTIC”
               },
               {
                  “名字”:“runningClub”,
                  “type”:“SEMANTIC”
               },
               {
                  “名字”:“totalRuns”,
                  “type”:“SEMANTIC”
               }
            ]
         },
         {
            “id”:“get-runners”,
            “名字”:“跑步者”,
            “型別”:“安全”,
            “rt”:“#parkRunner-representation”
         },
         {
            “id”:“創造跑步者”,
            “名字”:“跑步者”,
            “type”:“UNSAFE”,
            “rt”:“#parkRunner-representation”
         },
         {
            “id”:“patch-parkRunner”,
            “名字”:“parkRunner”,
            “type”:“UNSAFE”,
            “rt”:“#parkRunner-representation”
         },
         {
            “id”:“get-parkRunner”,
            “名字”:“parkRunner”,
            “型別”:“安全”,
            “rt”:“#parkRunner-representation”
         },
         {
            “id”:“delete-parkRunner”,
            “名字”:“parkRunner”,
            “type”:“IDEMPOTENT”,
            “rt”:“#parkRunner-representation”
         },
         {
            “id”:“update-parkRunner”,
            “名字”:“parkRunner”,
            “type”:“IDEMPOTENT”,
            “rt”:“#parkRunner-representation”
         }
      ]
   }
}


希望這有助於您更好地理解Kotlin中REST API的快速開發。 快樂的編碼!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557424/viewspace-2220401/,如需轉載,請註明出處,否則將追究法律責任。

相關文章