Kotlin und Java Code im Spring Projekt mischen
Kotlin und Java sind beides Programmiersprachen, die auf der JVM aufsetzen. Deshalb ist es möglich Java Klassen in einem Kotlin Projekt zu schreiben und zu verwenden. Java-Dateien können aber auch automatisch in Kotlin übersetzt werden. Ich werde euch hier einen entsprechenden Mischmasch präsentieren! 😄
Warum Kotlin und Java mischen?
Kotlin ist für mich die nächste Evolutionsstufe und ich möchte zeigen wie einfach und risikofrei ihr diesen Schritt gehen könnt.
Kotlin und Java Code im Spring Boot Projekt gemischt
Java war zwar zuerst da, kann aber nicht als Ausgangspunkt verwendet werden. Wir benötigen ein Kotlin Projekt, da dieses den Kotlin Compiler, die Kotlin Bibliotheken und ein JDK beinhaltet. Ein solches Projekt könnt ihr mit Spring Boot erstellen, so wie ich es hier gezeigt habe:
kotlin-spring-api.html
Ohne Spring Boot ist es nicht so einfach passende Build-Konfigurationen zu erstellen, die Bytecode für die Kotlin- und Java-Klassen erstellen.
Verzeichnisse erstellen und Spring Component Scan konfigurieren
Die Kotlin Sourcecode-Dateien befinden sich nun standardmäßig im Verzeichnis "src/main/kotlin". Für den Java Sourcecode habe ich ein 2. Verzeichnis erstellt, so wie es standardmäßig in Java basierten Spring Projekten existiert: "src/main/java". In beiden Verzeichnissen habe ich danach Packages mit gleichem Prefix "de.bsi" erstellt. Da wir unterschiedliche Sourcecode Basis-Verzeichnisse haben "src/main/kotlin" und "src/main/java", musste ich die Klasse mit der main-Methode zum Starten der Spring Anwendung minimal anpassen - ich habe im Attribut scanBasePackages der Annotation @SpringBootApplicationdie die verwendeten Packages bzw. den gemeinsamen Prefix "de.bsi" gesetzt, da ansonsten die Beans im "src/main/java" Verzeichnis nicht gefunden werden:
@SpringBootApplication(scanBasePackages = ["de.bsi"])
class RestKotlinApplication
fun main(args: Array<String>) {
runApplication<RestKotlinApplication>(*args)
}
Code bzw. Beans mischen
@RestController
class MixedController(@Autowired val javaIdGenerator: IdGenerator,
@Autowired val kotlinPrefixGenerator: PrefixGenerator) {
@GetMapping("/id")
@ResponseStatus(HttpStatus.OK)
fun generateId() =
"KOTLIN:".plus(kotlinPrefixGenerator.generateId())
.plus("___JAVA:").plus(javaIdGenerator.generateId())
}
- Alle hier verwendeten Annotationen habe ich in diesem Artikel vorgestellt:
rest-json-apis-in-java-mit-spring.html - Im restlichen Kotlin-Code passiert auch nicht viel außergewöhnliches. Weitere Details zu Kotlin findet ihr hier: https://kotlinlang.org/docs/home.html
- Die per Constructor Injection (@Autowired) injizierte Bean javaIdGenerator ist in Java geschrieben und sieht so aus:
@Component
public class IdGenerator {
private Integer prefix;
@PostConstruct
private void initPrefixAfterConstruction() {
this.prefix = new Random().nextInt(100);
}
public String generateId() {
String uuid = UUID.randomUUID().toString();
return String.format("%d_%s", this.prefix, uuid);
}
}
- Auch in der Spring Bean IdGenerator gibt es keine Besonderheiten. Ich generiere eine Zufallszahl kleiner 100 als Prefix für die UUIDs, die in der Methode generateId generiert werden.
Java Code in Kotlin umwandeln
Java-Klasse per Klick in Kotlin-Klasse konvertieren |
Das Ergebnis der Konvertierung sieht dann so aus:
@Component
class IdGenerator {
private var prefix: Int? = null
@PostConstruct
private fun initPrefixAfterConstruction() {
prefix = Random().nextInt(100)
}
fun generateId(): String {
val uuid = UUID.randomUUID().toString()
return String.format("%d_%s", prefix, uuid)
}
}
Kommentare