Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot

Mit der Einführung von Google als offizielle Sprache für Android wächst die Kotlin-Gemeinde. In der Zwischenzeit sind wir von Java, das als serverseitige Sprache verwendet wird, zu serverseitigem Kotlin gewechselt.

Vor- und Nachteile der Einführung von Kotlin: baby_chick:

Hier sind einige der Vorteile einer Migration nach Kotlin. Es ist eine leichte Einführung, da es sich um eine Sprachspezifikation des Teils handelt, über den oft gesprochen wird.

verdienen

Fehler

In Kotlin können Sie einer Variablen des Typs, der nicht optional ist, keine Null zuweisen. Es ist sehr sicher, da der Compiler garantiert, dass es nicht null ist. Wenn dies optional ist, ist beim Abrufen des Werts eine Überprüfung erforderlich.

fun main(vararg args: String) {
    val user: User? = null
    println(user?.fullName ?: "unknown")
}

data class User(val familyName: String, val firstName: String) {
    val fullName: String
    	get() = "${this.familyName} ${this.firstName}"
}

Kotlin hat einen ähnlichen When-Ausdruck wie Scalas Match. Es entspricht einem Schalter in Java, gibt jedoch einen Wert zurück und garantiert die Vollständigkeit der Aufzählung.

fun method(license: License) {
    val service = license.createService()
}

enum class License {
    FREE,
    ENETERPRISE;
    
    fun createService(): Service {
        return when (this) {
            FREE -> FreeService()
            ENETERPRISE -> EnterpriseService()
        }
    }
}

interface Service { ... }
class FreeService: Service { ... }
class EnterpriseService: Service { ... }

Diese (Lizenz) wird im when-Ausdruck übergeben. Wir wissen, dass die Lizenz KOSTENLOS oder UNTERNEHMEN ist, daher müssen wir den Standardprozess (oder sonst in Kotlin) nicht in den when-Ausdruck schreiben. Außerdem: ** Wenn das Aufzählungsmuster nicht angegeben ist, tritt ein Kompilierungsfehler auf, sodass die Vollständigkeit garantiert werden kann *. ( Es gibt einige Einschränkungen)

・ ・ ・

Die Skalierung und Übernahme des Systems dauert lange. Kotlin wird mit gültigen Sprachspezifikationen geliefert, um diese sicher auszuführen. Ich denke, dass die im Verdienst erwähnten Funktionen bemerkenswerte Funktionen sind, die Kotlin übernehmen, weil sie eine stärkere Unterstützung als Java haben.

Abgesehen davon war, da das vorhandene System mit Spring-boot + Mavan gebaut wurde, die Möglichkeit, es so zu verwenden, wie es ist, auch ein wichtiger Faktor für den Übergang, da die Lernkosten erheblich reduziert wurden.

Probleme bei der Einführung von Server Side Kotlin + Spring-Boot: Füße:

Trotz der Vorteile gab es einige Stolpersteine in der tatsächlichen Entwicklung. Ich möchte einige davon vorstellen.

Die statische Ausführungsmethode für SpringApplication kann nicht gefunden werden

In Java wird SpringApplication wie folgt beschrieben, funktionierte jedoch nicht, wenn es von Spring Initializr generiert wurde.

@EnableAutoConfiguration
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Kotlins Statik wird über Companion (sowie Scala) implementiert. Schreiben Sie also: Fügen Sie außerdem die Annotation JvmStatic hinzu, damit sie von Java aus aufgerufen werden kann.

@SpringBootApplication
@EnableAutoConfiguration
class MyApplication {
    companion object {
        @JvmStatic fun main(vararg args: String) {
            SpringApplication.run(MyApplication::class.java, *args)
        }
    }
}

Mockitos any oder anyObject löst eine Ausnahme aus

Mockitos any / anyObject wird intern implementiert, um null zurückzugeben. Wenn ich versuche, dies in Kotlin zu verwenden, erhalte ich eine IllegalStateException-Ausnahme **, wenn sie an ein Nicht-Null-Argument ** übergeben wird.

Als Lösung scheint es möglich zu sein, die Nullprüfung mit Kotlins Generika zu überwinden. Sie können die folgende Helper-Klasse verwenden.

class MockitoHelper {
    companion object {
        fun <T> any(): T {
            return Mockito.any() ?: null as T
        }
    }

    fun <T> eq(value: T): T {
        return if (value != null) Mockito.eq(value)
               else null ?: null as T
    }
}

Ich habe auf den Artikel [hier] verwiesen (http://jabnz.blog69.fc2.com/blog-entry-935.html). Danke: Bogen: *** Bitte beachten Sie, dass diese Lösung möglicherweise nicht mehr verfügbar ist **.

Der primäre Konstruktor für die Datenklasse mit der RequestBody-Annotation kann nicht gefunden werden

Json konnte der DataClassResource nicht zugeordnet werden und löste eine Ausnahme aus, als ich gerade den üblichen Java-Code in Kotlin ablegte.

data class DataClassResource(val key: String, val value: String)

@RestController
@Component
class DataClassController {
  
    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/update", method = arrayOf(PUT), produces = arrayOf(APPLICATION_JSON_VALUE))
    fun update(@RequestBody resource: DataClassResource) {
        ...
    }
}

Ich rufe den Konstruktor einer Klasse mit der Annotation RequestBody auf, um sie zu initialisieren, aber ich kann den primären Konstruktor für Kotlin nicht finden.

Dieses Problem kann behoben werden, indem eine Kotlin-fähige Version des Jackson-Moduls als Abhängigkeit hinzugefügt wird. Fügen wir das folgende Paket als Abhängigkeit hinzu.

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.8.0</version>
</dependency>

Tips :cookie:

Java-Klassen können nicht erweitert werden, da die statische Methode Extension nur eine Klasse mit einem Companion-Objekt sein kann

Wenn Sie statische Methoden in Kotlin erweitern, implementieren Sie sie über Companion. Java-Klassen verfügen jedoch nicht über Companion-Objekte, sodass sie keine Erweiterungsfunktionen oder -eigenschaften wie Folgendes implementieren können:

fun JavaClass.Companion.extensionMethod() {
    ...
}

Es gibt auch ein Problem bei YouTrack. Ich möchte, dass Sie es implementieren. https://youtrack.jetbrains.com/issue/KT-11968

Unterstützt Java-Methoden, die mit Optional möglicherweise Null sind

Java-Methoden können null sein, auch wenn sie nicht optional sind. Wenn Sie die Sicherheit im Bereich Kotlin gewährleisten möchten, ist es besser, das Ergebnis der Java-Methode als optional zu erhalten.

val maybe: String? = javaClass.method()

Bean Injection definiert als val

Wenn Sie beim Definieren der Eigenschaft, die mit der Autowired-Annotation eingefügt werden soll, diese normal definieren, wird aufgrund der Nichtinitialisierung ein Kompilierungsfehler verursacht. Definieren Sie sie daher für die verzögerte Initialisierung mit "lateinit".

@Component("sample")
class Sample {
    @Autowired
    private lateinit var dependency: Dependency
}

Lateinit kann jedoch nur mit var definiert werden. Wenn Sie mit val definieren möchten, verwenden Sie den Primärkonstruktor.

@Component("sample")
class Sample @Autowired constructor(private val dependency: Dependency) {
}

Ich möchte Eigenschaften definieren, die sich mit Immutable nicht so weit wie möglich ändern.

Am Ende

Trotz einiger Stolpersteine konnten wir die Entwicklung mit stabiler Geschwindigkeit fortsetzen. Es ist auf Compilerebene sicherer und hat eine bessere Code-Sichtbarkeit. Ich denke, dass die Leistungsfähigkeit dieser Unterstützung in Zukunft bei der Skalierung demonstriert wird. Es gibt auch eine Beschreibung, die Kotlin eigen ist. Es wäre also gut, fortzufahren, während Sie die Richtlinien in der Überprüfung untersuchen! Ich hatte jedoch das Gefühl, dass die Schwelle für die Migration von Java nach Kotlin und die Lernkosten wieder niedrig waren. Ich möchte, dass Server Side Kotlin immer aufregender wird: tada:

Recommended Posts

Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
Memo für die Migration von Java nach Kotlin
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Migrieren Sie von JUnit 4 zu JUnit 5
[Java] So rufen Sie die von HTML auf der Serverseite übergebenen Parameter ab
Überprüfen Sie das von Firebase auf der Serverseite erhaltene ID-Token (Java + SpringBoot).
Von Java zu Ruby !!
Minecraft BE Serverentwicklung von PHP nach Java
Migration von Cobol nach JAVA
Neue Funktionen von Java7 bis Java8
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Von ineffektivem Java zu effektivem Java
Gibt an, ob die Serverseite zum Zeitpunkt der Systemwiederherstellung mit Kotlin oder Java erstellt werden soll
Stoppen Sie das erneute Senden vom Client zum Server
Kotlin-Klasse zum Senden an Java-Entwickler
Migrieren Sie das Docker-Image auf einen anderen Server
Migrieren Sie von on-prepukiwiki zu esa.io \ (⁰⊖⁰) /
Java soll ab heute dabei sein
Von Java zu VB.NET-Writing Kontrastmemo-
Java, Schnittstelle für Anfänger
Der Weg von JavaScript nach Java
[Android] Konvertieren Sie Android Java-Code in Kotlin
[Java] Konvertierung von Array zu Liste
Hinweise zum Erstellen der Kotlin-Entwicklungsumgebung und zur Migration von Java nach Kotlin
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren
Kotlins Klasse Teil 2 zum Senden an Java-Entwickler
[Kotlin] Drei Möglichkeiten, um Klasse von KClass zu bekommen
Konvertieren Sie alle Android-Apps (Java) in Kotlin
Kick ShellScript auf dem Server von Java
Konvertieren Sie von der Java-UTC-Zeit in die JST-Zeit
Stellen Sie mit Eclipse eine Verbindung von Java zu MySQL her
Von der Installation von Eclipse bis zur Ausführung von Java (PHP)
Kotlin-Scope-Funktionen zum Senden an Java-Entwickler
Post to Slack von Play Framework 2.8 (Java)
Java: So senden Sie Werte von Servlet zu Servlet
[Java] Fluss vom Quellcode zur Ausführung
Abrufen des Verlaufs vom Zabbix-Server in Java
Einführung in die Überwachung von Java Touching Prometheus
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
Lassen Sie uns migrieren, um Java komfortabler zu machen
Typkonvertierung vom Java Big Decimal-Typ zum String-Typ
Zusammenfassung der Punkte, über die ich mir bei der Migration von Java nach Kotlin Sorgen gemacht habe
[Java] Von zwei Listen zu einer Array-Liste
Kotlin-Funktionen und Lambdas zum Senden an Java-Entwickler
Migrieren Sie Ubuntu 18.04 LTS von der Festplatte auf eine kleinere SSD
R von Java ausführen Ich möchte rJava ausführen
Einführung in Kotlin in ein bestehendes Java Maven-Projekt
Stellen Sie über eine Java-Anwendung eine Verbindung zu Aurora (MySQL) her
Um ein VB.net-Programmierer aus einem Java-Shop zu werden
So erhalten Sie eine Klasse von Element in Java
Grundeinstellungen für das Umschreiben von Java-Projekten in Kotlin
Migration von der Eclipse-Serverfunktion (Tomcat) zum Einbetten von Tomcat
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
[Java] So wechseln Sie von Open JDK zu Oracle JDK
Migrieren Sie vom Transport Client zum Rest High Level Client
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Für Java-Ingenieure, die ab sofort Kotlin starten
Ich möchte schnell von Java nach SQLite schreiben
Wo Java-Programmierer dazu neigen, über Kotlin zu stolpern