Lớp dữ liệu trừu tượng python

Hướng dẫn này chỉ cho bạn cách xây dựng một ứng dụng blog mẫu hiệu quả bằng cách kết hợp sức mạnh của Spring Boot và Kotlin

Nếu bạn đang bắt đầu với Kotlin, bạn có thể học ngôn ngữ này bằng cách đọc tài liệu tham khảo, làm theo hướng dẫn Kotlin Koans trực tuyến hoặc chỉ sử dụng tài liệu tham khảo Spring Framework hiện cung cấp các mẫu mã trong Kotlin

Hỗ trợ Spring Kotlin được ghi lại trong tài liệu tham khảo Spring Boot và Spring Boot. Nếu bạn cần trợ giúp, hãy tìm kiếm hoặc đặt câu hỏi với các thẻ

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
7 và
dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
8 trên StackOverflow hoặc tham gia thảo luận trong kênh
dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
9 của Kotlin Slack

Tạo một dự án mới

Đầu tiên chúng ta cần tạo một ứng dụng Spring Boot, có thể thực hiện theo một số cách

Sử dụng trang web Initializr

Truy cập https. //bắt đầu. mùa xuân. io và chọn ngôn ngữ Kotlin. Gradle là công cụ xây dựng được sử dụng phổ biến nhất trong Kotlin và nó cung cấp Kotlin DSL được sử dụng theo mặc định khi tạo dự án Kotlin, vì vậy đây là lựa chọn được đề xuất. Nhưng bạn cũng có thể sử dụng Maven nếu cảm thấy thoải mái hơn với nó. Lưu ý rằng bạn có thể sử dụng để chọn Kotlin và Gradle theo mặc định

  1. Chọn "Gradle - Kotlin" hoặc "Maven" tùy thuộc vào công cụ xây dựng bạn muốn sử dụng

  2. Nhập tọa độ hiện vật sau.

    spring.jpa.properties.hibernate.globally_quoted_identifiers=true
    spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
    0

  3. Thêm các phụ thuộc sau

    • web mùa xuân

    • Ria

    • Dữ liệu mùa xuân JPA

    • Cơ sở dữ liệu H2

    • Spring Boot DevTools

  4. Nhấp vào "Tạo dự án"

Các. zip chứa một dự án tiêu chuẩn trong thư mục gốc, vì vậy bạn có thể muốn tạo một thư mục trống trước khi giải nén nó

Sử dụng dòng lệnh

Ví dụ, bạn có thể sử dụng API HTTP Initializr với curl trên hệ thống giống như UN*X

$ mkdir blog && cd blog
$ curl https://start.spring.io/starter.zip -d language=kotlin -d type=gradle-project-kotlin -d dependencies=web,mustache,jpa,h2,devtools -d packageName=com.example.blog -d name=Blog -o blog.zip

Thêm

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
1 nếu bạn muốn sử dụng Gradle

Sử dụng IntelliJ IDEA

Spring Initializr cũng được tích hợp trong phiên bản IntelliJ IDEA Ultimate và cho phép bạn tạo và nhập một dự án mới mà không cần phải thoát khỏi IDE cho dòng lệnh hoặc giao diện người dùng web

Để truy cập trình hướng dẫn, hãy chuyển đến Tệp. Mới. Project và chọn Spring Initializr

Làm theo các bước của trình hướng dẫn để sử dụng các tham số sau

  • hiện vật. "Blog"

  • Loại. "Gradle - Kotlin" hoặc "Maven"

  • Ngôn ngữ. Kotlin

  • Tên. "Blog"

  • phụ thuộc. "Trình khởi động web mùa xuân", "Mustache", "JPA dữ liệu mùa xuân", "Cơ sở dữ liệu H2" và "Công cụ dành cho nhà phát triển khởi động mùa xuân"

Hiểu bản dựng Gradle

Nếu bạn đang sử dụng Maven Build, bạn có thể

bổ sung

Ngoài plugin Kotlin Gradle rõ ràng, cấu hình mặc định khai báo tự động mở các lớp và phương thức (không giống như trong Java, vòng loại mặc định là

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
2 trong Kotlin) được chú thích hoặc siêu chú thích với các chú thích Spring. Điều này rất hữu ích để có thể tạo các hạt đậu
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
3 hoặc
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
4 mà không phải thêm từ hạn định
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
5 theo yêu cầu của các proxy CGLIB chẳng hạn

Để có thể sử dụng các thuộc tính không thể vô hiệu hóa của Kotlin với JPA, cũng được bật. Nó tạo ra các hàm tạo không có đối số cho bất kỳ lớp nào được chú thích bằng

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
6,
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
7 hoặc
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
8

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}

Tùy chọn trình biên dịch

Một trong những tính năng chính của Kotlin là null-safety - giải quyết rõ ràng các giá trị


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
0 tại thời điểm biên dịch thay vì chạm vào giá trị nổi tiếng

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
1 tại thời điểm chạy. Điều này làm cho các ứng dụng an toàn hơn thông qua các tuyên bố về tính vô hiệu và thể hiện ngữ nghĩa "có giá trị hoặc không có giá trị" mà không phải trả chi phí cho các trình bao bọc như

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
2. Lưu ý rằng Kotlin cho phép sử dụng các cấu trúc chức năng có giá trị nullable;

Mặc dù Java không cho phép một người thể hiện tính an toàn không có giá trị trong hệ thống kiểu của nó, nhưng Spring Framework cung cấp tính an toàn không có giá trị cho toàn bộ API Spring Framework thông qua các chú thích thân thiện với công cụ được khai báo trong gói


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
3. Theo mặc định, các loại từ API Java được sử dụng trong Kotlin được công nhận là loại kiểm tra null được nới lỏng. + Chú thích vô hiệu hóa mùa xuân cung cấp tính an toàn vô hiệu cho toàn bộ Spring Framework API cho các nhà phát triển Kotlin, với lợi thế là xử lý các vấn đề liên quan đến

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
0 tại thời điểm biên dịch

Tính năng này có thể được kích hoạt bằng cách thêm cờ trình biên dịch


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
5 với các tùy chọn

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
6

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}

phụ thuộc

Cần có 2 thư viện dành riêng cho Kotlin (thư viện chuẩn được thêm tự động bằng Gradle) cho ứng dụng web Spring Boot đó và được định cấu hình theo mặc định

  • 
        ${project.basedir}/src/main/kotlin
        ${project.basedir}/src/test/kotlin
        
          
            org.springframework.boot
            spring-boot-maven-plugin
          
          
            org.jetbrains.kotlin
            kotlin-maven-plugin
            
              
                jpa
                spring
              
              
                -Xjsr305=strict
              
            
            
              
                org.jetbrains.kotlin
                kotlin-maven-noarg
                ${kotlin.version}
              
              
                org.jetbrains.kotlin
                kotlin-maven-allopen
                ${kotlin.version}
              
            
          
        
      
    8 là thư viện phản chiếu Kotlin

  • 
        ${project.basedir}/src/main/kotlin
        ${project.basedir}/src/test/kotlin
        
          
            org.springframework.boot
            spring-boot-maven-plugin
          
          
            org.jetbrains.kotlin
            kotlin-maven-plugin
            
              
                jpa
                spring
              
              
                -Xjsr305=strict
              
            
            
              
                org.jetbrains.kotlin
                kotlin-maven-noarg
                ${kotlin.version}
              
              
                org.jetbrains.kotlin
                kotlin-maven-allopen
                ${kotlin.version}
              
            
          
        
      
    9 thêm hỗ trợ tuần tự hóa/giải tuần tự hóa các lớp Kotlin và lớp dữ liệu (các lớp hàm tạo đơn lẻ có thể được sử dụng tự động và những lớp có hàm tạo thứ cấp hoặc nhà máy tĩnh cũng được hỗ trợ)

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}

Các phiên bản gần đây của H2 yêu cầu cấu hình đặc biệt để thoát đúng các từ khóa dành riêng như


  
    org.springframework.boot
    spring-boot-starter-data-jpa
  
  
    org.springframework.boot
    spring-boot-starter-mustache
  
  
    org.springframework.boot
    spring-boot-starter-web
  
  
    com.fasterxml.jackson.module
    jackson-module-kotlin
  
  
    org.jetbrains.kotlin
    kotlin-reflect
  
  
    org.jetbrains.kotlin
    kotlin-stdlib
  

  
    org.springframework.boot
    spring-boot-devtools
    runtime
  
  
    com.h2database
    h2
    runtime
  
  
    org.springframework.boot
    spring-boot-starter-test
    test
  
1


  
    org.springframework.boot
    spring-boot-starter-data-jpa
  
  
    org.springframework.boot
    spring-boot-starter-mustache
  
  
    org.springframework.boot
    spring-boot-starter-web
  
  
    com.fasterxml.jackson.module
    jackson-module-kotlin
  
  
    org.jetbrains.kotlin
    kotlin-reflect
  
  
    org.jetbrains.kotlin
    kotlin-stdlib
  

  
    org.springframework.boot
    spring-boot-devtools
    runtime
  
  
    com.h2database
    h2
    runtime
  
  
    org.springframework.boot
    spring-boot-starter-test
    test
  
2

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true

Plugin Spring Boot Gradle tự động sử dụng phiên bản Kotlin được khai báo thông qua plugin Kotlin Gradle

Bây giờ bạn có thể lấy một

Hiểu bản dựng Maven

bổ sung

Ngoài plugin Kotlin Maven rõ ràng, cấu hình mặc định khai báo tự động mở các lớp và phương thức (không giống như trong Java, vòng loại mặc định là

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
2 trong Kotlin) được chú thích hoặc siêu chú thích với các chú thích Spring. Điều này rất hữu ích để có thể tạo các hạt đậu
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
3 hoặc
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
4 mà không phải thêm từ hạn định
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
5 theo yêu cầu của các proxy CGLIB chẳng hạn

Để có thể sử dụng các thuộc tính không thể vô hiệu hóa của Kotlin với JPA, cũng được bật. Nó tạo ra các hàm tạo không có đối số cho bất kỳ lớp nào được chú thích bằng

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
6,
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
7 hoặc
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
8

package com.example.blog

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class BlogApplication

fun main(args: Array) {
  runApplication(*args)
}
0


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  

Một trong những tính năng chính của Kotlin là null-safety - giải quyết rõ ràng các giá trị


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
0 tại thời điểm biên dịch thay vì chạm vào giá trị nổi tiếng

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
1 tại thời điểm chạy. Điều này làm cho các ứng dụng an toàn hơn thông qua các tuyên bố về tính vô hiệu và thể hiện ngữ nghĩa "có giá trị hoặc không có giá trị" mà không phải trả chi phí cho các trình bao bọc như

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
2. Lưu ý rằng Kotlin cho phép sử dụng các cấu trúc chức năng có giá trị nullable;

Mặc dù Java không cho phép một người thể hiện tính an toàn không có giá trị trong hệ thống kiểu của nó, nhưng Spring Framework cung cấp tính an toàn không có giá trị cho toàn bộ API Spring Framework thông qua các chú thích thân thiện với công cụ được khai báo trong gói


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
3. Theo mặc định, các loại từ API Java được sử dụng trong Kotlin được công nhận là loại kiểm tra null được nới lỏng. + Chú thích vô hiệu hóa mùa xuân cung cấp tính an toàn vô hiệu cho toàn bộ Spring Framework API cho các nhà phát triển Kotlin, với lợi thế là xử lý các vấn đề liên quan đến

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
0 tại thời điểm biên dịch

Tính năng này có thể được kích hoạt bằng cách thêm cờ trình biên dịch


    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
5 với các tùy chọn

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
6

Cũng lưu ý rằng trình biên dịch Kotlin được cấu hình để tạo Java 8 bytecode (Java 6 theo mặc định)

phụ thuộc

3 thư viện dành riêng cho Kotlin được yêu cầu cho ứng dụng web Spring Boot đó và được định cấu hình theo mặc định

  • package com.example.blog
    
    import org.springframework.boot.autoconfigure.SpringBootApplication
    import org.springframework.boot.runApplication
    
    @SpringBootApplication
    class BlogApplication
    
    fun main(args: Array) {
      runApplication(*args)
    }
    8 là thư viện tiêu chuẩn của Kotlin

  • 
        ${project.basedir}/src/main/kotlin
        ${project.basedir}/src/test/kotlin
        
          
            org.springframework.boot
            spring-boot-maven-plugin
          
          
            org.jetbrains.kotlin
            kotlin-maven-plugin
            
              
                jpa
                spring
              
              
                -Xjsr305=strict
              
            
            
              
                org.jetbrains.kotlin
                kotlin-maven-noarg
                ${kotlin.version}
              
              
                org.jetbrains.kotlin
                kotlin-maven-allopen
                ${kotlin.version}
              
            
          
        
      
    8 là thư viện phản chiếu Kotlin

  • 
        ${project.basedir}/src/main/kotlin
        ${project.basedir}/src/test/kotlin
        
          
            org.springframework.boot
            spring-boot-maven-plugin
          
          
            org.jetbrains.kotlin
            kotlin-maven-plugin
            
              
                jpa
                spring
              
              
                -Xjsr305=strict
              
            
            
              
                org.jetbrains.kotlin
                kotlin-maven-noarg
                ${kotlin.version}
              
              
                org.jetbrains.kotlin
                kotlin-maven-allopen
                ${kotlin.version}
              
            
          
        
      
    9 thêm hỗ trợ tuần tự hóa/giải tuần tự hóa các lớp Kotlin và lớp dữ liệu (các lớp hàm tạo đơn lẻ có thể được sử dụng tự động và những lớp có hàm tạo thứ cấp hoặc nhà máy tĩnh cũng được hỗ trợ)

package com.example.blog

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class BlogApplication

fun main(args: Array) {
  runApplication(*args)
}
0


  
    org.springframework.boot
    spring-boot-starter-data-jpa
  
  
    org.springframework.boot
    spring-boot-starter-mustache
  
  
    org.springframework.boot
    spring-boot-starter-web
  
  
    com.fasterxml.jackson.module
    jackson-module-kotlin
  
  
    org.jetbrains.kotlin
    kotlin-reflect
  
  
    org.jetbrains.kotlin
    kotlin-stdlib
  

  
    org.springframework.boot
    spring-boot-devtools
    runtime
  
  
    com.h2database
    h2
    runtime
  
  
    org.springframework.boot
    spring-boot-starter-test
    test
  

Hiểu ứng dụng được tạo

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
2

package com.example.blog

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class BlogApplication

fun main(args: Array) {
  runApplication(*args)
}

So với Java, bạn có thể nhận thấy thiếu dấu chấm phẩy, thiếu dấu ngoặc trên lớp trống (bạn có thể thêm một số nếu bạn cần khai báo các bean thông qua chú thích

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
3) và việc sử dụng hàm cấp cao nhất
fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
4.
fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
5 là thành ngữ Kotlin thay thế cho
fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
6 và có thể được sử dụng để tùy chỉnh ứng dụng với cú pháp sau

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
2

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}

Viết bộ điều khiển Kotlin đầu tiên của bạn

Hãy tạo một bộ điều khiển đơn giản để hiển thị một trang web đơn giản

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
8

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}

Lưu ý rằng chúng tôi đang sử dụng ở đây một tiện ích mở rộng Kotlin cho phép thêm các hàm hoặc toán tử của Kotlin vào các loại Spring hiện có. Ở đây chúng ta nhập hàm mở rộng

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
9 để có thể viết
package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
0 thay vì
package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
1. Spring Framework KDoc API liệt kê tất cả các tiện ích mở rộng của Kotlin được cung cấp để làm phong phú thêm Java API

Chúng ta cũng cần tạo các mẫu Mustache liên quan

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
2

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
0

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
3

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
1

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
4

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
2

Khởi động ứng dụng web bằng cách chạy chức năng

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
5 của
package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
6, và đi đến
package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
7, bạn sẽ thấy một trang web tỉnh táo với tiêu đề "Blog"

Thử nghiệm với JUnit 5

JUnit 5 hiện được sử dụng theo mặc định trong Spring Boot cung cấp nhiều tính năng khác nhau rất tiện dụng với Kotlin, bao gồm tính năng cho phép sử dụng các thuộc tính

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
8 không thể vô hiệu hóa và khả năng sử dụng ____61_______9/
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
00 trên các phương thức không tĩnh thông thường

Viết bài kiểm tra JUnit 5 trong Kotlin

Vì lợi ích của ví dụ này, hãy tạo một thử nghiệm tích hợp để chứng minh các tính năng khác nhau

  • Chúng tôi sử dụng các câu thực giữa các backticks thay vì camel-case để cung cấp các tên hàm kiểm tra biểu cảm

  • JUnit 5 cho phép thêm các tham số phương thức và hàm tạo, phù hợp với các thuộc tính chỉ đọc và không thể vô hiệu hóa của Kotlin

  • Mã này tận dụng các tiện ích mở rộng của Kotlin

    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    plugins {
      id("org.springframework.boot") version "3.0.1"
      id("io.spring.dependency-management") version "1.1.0"
      kotlin("jvm") version "1.8.0"
      kotlin("plugin.spring") version "1.8.0"
      kotlin("plugin.jpa") version "1.8.0"
    }
    01 và
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    plugins {
      id("org.springframework.boot") version "3.0.1"
      id("io.spring.dependency-management") version "1.1.0"
      kotlin("jvm") version "1.8.0"
      kotlin("plugin.spring") version "1.8.0"
      kotlin("plugin.jpa") version "1.8.0"
    }
    02 (bạn cần nhập chúng)

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
03

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
3

Vòng đời của phiên bản thử nghiệm

Đôi khi bạn cần thực thi một phương thức trước hoặc sau tất cả các bài kiểm tra của một lớp nhất định. Giống như Junit 4, JUnit 5 theo mặc định yêu cầu các phương thức này là tĩnh (có nghĩa là trong Kotlin, khá dài dòng và không đơn giản) vì các lớp kiểm tra được khởi tạo một lần cho mỗi lần kiểm tra

Nhưng Junit 5 cho phép bạn thay đổi hành vi mặc định này và khởi tạo các lớp kiểm tra một lần cho mỗi lớp. Điều này có thể được thực hiện trong , ở đây chúng tôi sẽ sử dụng tệp thuộc tính để thay đổi hành vi mặc định cho toàn bộ dự án

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
05

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
4

Với cấu hình này, giờ đây chúng ta có thể sử dụng các chú thích

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
9 và
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
00 trên các phương thức thông thường như được hiển thị trong phiên bản cập nhật của
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
08 ở trên

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
03

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
5

Tạo tiện ích mở rộng của riêng bạn

Thay vì sử dụng các lớp util với các phương thức trừu tượng như trong Java, Kotlin thường cung cấp các chức năng như vậy thông qua các tiện ích mở rộng của Kotlin. Ở đây chúng ta sẽ thêm một hàm

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
10 vào loại
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
11 hiện có để tạo văn bản với định dạng ngày tháng tiếng Anh

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
12

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
6

Chúng tôi sẽ tận dụng các tiện ích mở rộng này trong phần tiếp theo

Kiên trì với JPA

Để làm cho quá trình tìm nạp chậm hoạt động như mong đợi, các thực thể phải là ____3_______5 như được mô tả trong KT-28525. Chúng ta sẽ sử dụng plugin

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
14 của Kotlin cho mục đích đó

với lớp

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
7

Hoặc với Maven

package com.example.blog

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class BlogApplication

fun main(args: Array) {
  runApplication(*args)
}
0

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
8

Sau đó, chúng tôi tạo mô hình của mình bằng cách sử dụng Kotlin, cho phép khai báo đồng thời các thuộc tính và tham số hàm tạo

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
17

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
9

Lưu ý rằng chúng tôi đang sử dụng tiện ích mở rộng

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
18 ở đây để cung cấp đối số mặc định cho tham số
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
19 của hàm tạo
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
20. Các tham số tùy chọn có giá trị mặc định được xác định ở vị trí cuối cùng để có thể bỏ qua chúng khi sử dụng đối số vị trí (Kotlin cũng hỗ trợ ). Lưu ý rằng trong Kotlin, không có gì lạ khi nhóm các khai báo lớp ngắn gọn trong cùng một tệp

Ở đây chúng tôi không sử dụng các lớp

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
21 với các thuộc tính
package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
8 vì JPA không được thiết kế để hoạt động với các lớp bất biến hoặc các phương thức được tạo tự động bởi lớp
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
21. Nếu bạn đang sử dụng hương vị Spring Data khác, hầu hết chúng được thiết kế để hỗ trợ các cấu trúc như vậy, vì vậy bạn nên sử dụng các lớp như
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
24 khi sử dụng Spring Data MongoDB, Spring Data JDBC, v.v.

Mặc dù Spring Data JPA cho phép sử dụng ID tự nhiên (có thể là thuộc tính

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
25 trong lớp
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
26) thông qua , nhưng nó không phù hợp với Kotlin do KT-6653, đó là lý do tại sao bạn nên luôn sử dụng các thực thể được tạo

Chúng tôi cũng khai báo kho lưu trữ Spring Data JPA của chúng tôi như sau

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
28

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
0

Và chúng tôi viết các bài kiểm tra JPA để kiểm tra xem các trường hợp sử dụng cơ bản có hoạt động như mong đợi hay không

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
29

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
1

Ở đây, chúng tôi sử dụng tiện ích mở rộng

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
30 của Kotlin được cung cấp theo mặc định với Dữ liệu mùa xuân, đây là một biến thể không thể vô hiệu hóa của

    ${project.basedir}/src/main/kotlin
    ${project.basedir}/src/test/kotlin
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
      
        org.jetbrains.kotlin
        kotlin-maven-plugin
        
          
            jpa
            spring
          
          
            -Xjsr305=strict
          
        
        
          
            org.jetbrains.kotlin
            kotlin-maven-noarg
            ${kotlin.version}
          
          
            org.jetbrains.kotlin
            kotlin-maven-allopen
            ${kotlin.version}
          
        
      
    
  
2 dựa trên
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
32. Đọc Null tuyệt vời là bạn của bạn, không phải là một bài đăng trên blog sai lầm để biết thêm chi tiết

Triển khai công cụ blog

Chúng tôi cập nhật các mẫu Mustache "blog"

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
4

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
2

Và chúng tôi tạo một "bài viết" mới

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
34

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
3

Chúng tôi cập nhật

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
35 để hiển thị các trang blog và bài báo với ngày được định dạng. Các tham số hàm tạo của
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
36 và
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
37 sẽ được tự động nối dây vì
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
35 có một hàm tạo duy nhất (ẩn _______14_______39)

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
8

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
4

Sau đó, chúng tôi thêm phần khởi tạo dữ liệu vào một lớp

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
41 mới

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
42

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
5

Lưu ý việc sử dụng các tham số được đặt tên để làm cho mã dễ đọc hơn

Và chúng tôi cũng cập nhật các bài kiểm tra tích hợp cho phù hợp

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
03

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
6

Bắt đầu (hoặc khởi động lại) ứng dụng web và đi đến

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
7, bạn sẽ thấy danh sách các bài viết có liên kết có thể nhấp để xem một bài viết cụ thể

Hiển thị API HTTP

Bây giờ chúng tôi sẽ triển khai API HTTP thông qua bộ điều khiển chú thích

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
45

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
46

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
7

Đối với các bài kiểm tra, thay vì kiểm tra tích hợp, chúng tôi sẽ tận dụng

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
47 và Mockk tương tự như Mockito nhưng phù hợp hơn với Kotlin

Vì các chú thích

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
48 và
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
49 dành riêng cho Mockito, nên chúng tôi sẽ tận dụng SpringMockK cung cấp các chú thích tương tự
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
50 và
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
51 cho Mockk

với lớp

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
8

Hoặc với Maven

package com.example.blog

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class BlogApplication

fun main(args: Array) {
  runApplication(*args)
}
0

tasks.withType {
  kotlinOptions {
    freeCompilerArgs += "-Xjsr305=strict"
  }
}
9

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
54

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
0

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
55 cần được thoát trong chuỗi vì nó được sử dụng để nội suy chuỗi

Thuộc tính Cấu hình

Trong Kotlin, cách được đề xuất để quản lý thuộc tính ứng dụng của bạn là sử dụng thuộc tính chỉ đọc

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
56

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
1

Sau đó, chúng tôi kích hoạt nó ở cấp độ

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
57

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
2

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
2

Để tạo để IDE của bạn nhận ra các thuộc tính tùy chỉnh này, kapt phải được định cấu hình với phụ thuộc

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
59 như sau

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions = true
9

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
3

Lưu ý rằng một số tính năng (chẳng hạn như phát hiện giá trị mặc định hoặc các mục không dùng nữa) không hoạt động do những hạn chế trong mô hình mà kapt cung cấp. Ngoài ra, việc xử lý chú thích chưa được hỗ trợ với Maven do KT-18022, xem phần khởi tạo #438 để biết thêm chi tiết

Trong IntelliJ IDEA

  • Đảm bảo plugin Spring Boot được bật trong menu Tệp. Cài đặt. bổ sung. khởi động mùa xuân

  • Cho phép xử lý chú thích qua menu File. Cài đặt. Xây dựng, Thực thi, Triển khai. Trình biên dịch. Bộ xử lý chú thích. Bật xử lý chú thích

  • Vì Kapt chưa được tích hợp trong IDEA nên bạn cần chạy thủ công lệnh

    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    plugins {
      id("org.springframework.boot") version "3.0.1"
      id("io.spring.dependency-management") version "1.1.0"
      kotlin("jvm") version "1.8.0"
      kotlin("plugin.spring") version "1.8.0"
      kotlin("plugin.jpa") version "1.8.0"
    }
    61 để tạo siêu dữ liệu

Giờ đây, các thuộc tính tùy chỉnh của bạn sẽ được nhận dạng khi chỉnh sửa

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "3.0.1"
  id("io.spring.dependency-management") version "1.1.0"
  kotlin("jvm") version "1.8.0"
  kotlin("plugin.spring") version "1.8.0"
  kotlin("plugin.jpa") version "1.8.0"
}
62 (tự động hoàn thành, xác thực, v.v. )


  
    org.springframework.boot
    spring-boot-starter-data-jpa
  
  
    org.springframework.boot
    spring-boot-starter-mustache
  
  
    org.springframework.boot
    spring-boot-starter-web
  
  
    com.fasterxml.jackson.module
    jackson-module-kotlin
  
  
    org.jetbrains.kotlin
    kotlin-reflect
  
  
    org.jetbrains.kotlin
    kotlin-stdlib
  

  
    org.springframework.boot
    spring-boot-devtools
    runtime
  
  
    com.h2database
    h2
    runtime
  
  
    org.springframework.boot
    spring-boot-starter-test
    test
  
2

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
4

Chỉnh sửa mẫu và bộ điều khiển cho phù hợp

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
4

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
5

fun main(args: Array) {
  runApplication(*args) {
    setBannerMode(Banner.Mode.OFF)
  }
}
8

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-mustache")
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  runtimeOnly("com.h2database:h2")
  runtimeOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
6

Khởi động lại ứng dụng web, làm mới

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {

  @GetMapping("/")
  fun blog(model: Model): String {
    model["title"] = "Blog"
    return "blog"
  }

}
7, bạn sẽ thấy biểu ngữ trên trang chủ blog

Phần kết luận

Bây giờ chúng ta đã hoàn thành việc xây dựng ứng dụng blog Kotlin mẫu này. Mã nguồn có sẵn trên Github. Bạn cũng có thể xem tài liệu tham khảo Spring Boot nếu bạn cần thêm chi tiết về các tính năng cụ thể