REST-Service mittels Spring Boot aufsetzen

Sprint Boot vereinfacht das Setup eines Spring-Projektes und geht dabei nach der Methode Konvention vor Konfiguration vor. So lässt sich ein einfacher REST-Service mittels Spring Boot schnell und unkompliziert implementieren. Im ersten Schritt wird dazu mit dem Spring Initializr ein neues Projekt mit der Abhängigkeit Web angelegt.

Mit dem Spring Initializr wird ein Projekt mit der Abhängigkeit Web angelegt.

Nach dem Download des Projektes wird dieses in der IDE der Wahl (z.B. IntelliJ IDEA) geöffnet und eine Klasse mit dem Namen HelloWorldController angelegt. Die Klasse sollte im gleichen Package (in diesem Beispiel: com.example.demo) wie die DemoApplication angelegt werden und wie folgt aussehen:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @GetMapping("/hello")
    public String helloWorld(@RequestParam final String name) {
        return "Hello " + name + "!";
    }

    @GetMapping("/hello/{name}")
    public String helloWorld2(@PathVariable("name") final String name) {
        return "Hello " + name + "!";
    }
}

Über die Annotation @RestController wird dem Framework mitgeteilt das es sich bei dieser Klasse um einen Controller für die REST-API handelt. Anschließend wird die Ressource hello definiert. Diese kann über zwei Wege aufgerufen werden:

http://localhost:8080/hello?name=seeseekey
http://localhost:8080/hello/seeseekey

Bei beiden Aufrufen erscheint als Ergebnis der Text:

Hello seeseekey!

Der erste Aufruf wird auf die Methode helloWorld gemappt, während der zweite Aufruf mit dem Parameter in der URL an die Methode helloWorld2 gemappt wird. Mittels der Annotation @GetMapping wird der URL-Pfad festgelegt, auf welchen die Methode reagieren soll. Bei der ersten Methode kommt die Annotation @RequestParam zum Einsatz, welche einen gewöhnlich Parameter definiert, welcher von der eigentlichen URL abgetrennt ist. Dagegen wird mit der Annotation @PathVariable in der Methode helloWorld2 eine Variable im Pfad der eigentlichen URL definiert.

LoadingCache der Guava-Bibliothek nutzen

Für Java existiert eine Bibliothek mit dem Namen Guava. Diese, von Google entwickelte, Bibliothek bietet gewisse Basisfunktionalitäten, welche vom Java-Framework nicht abgedeckt werden. Eine dieser Funktionalitäten ist der LoadingCache. Bei diesem handelt es sich um einen Cache, welcher dazu genutzt werden kann die Ergebnisse zeitintensiver Operationen zwischenzuspeichern. Daneben verfügt er über die Informationen wie er die entsprechenden Daten bezogen werden. Um Guava zu nutzen muss die Bibliothek z.B. mittels Maven eingebunden werden. Dazu muss die pom.xml-Datei um eine Abhängigkeit erweitert werden:

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>27.0-jre</version>
</dependency>

Anschließend kann Guava in dem betreffenden Projekt genutzt werden. In diesem Beispiel soll der Cache dazu dienen Anfragen an einen Webservice zu cachen. Der Webservice liefert Daten zurück, welche in einem Objekt vom Typ BookData gespeichert werden:

class BookData {

	public final String title;
	public final String description;
	public final double price;

	public BookData(String title, String description, double price) {
		this.title = title;
		this.description = description;
		this.price = price;
	}
}

Innerhalb der Anwendung übernimmt die Methode getBookData die Aufgabe, diese Daten vom Webservice zu beziehen:

public BookData getBookData(String isbn) {
	return bookdataService.getData(isbn);
}

Der LoadingCache von Guava ist technisch betrachtet eine Map. Bei der Initialisierung ist dies ersichtlich:

LoadingCache<String, BookData> books = CacheBuilder.newBuilder()
		.maximumSize(1000)
		.expireAfterWrite(7, TimeUnit.DAYS)
		.build(
				new CacheLoader<String, BookData>() {
					public BookData load(String isbn) {
						return getBookData(isbn);
					}
				});

Beim Anlegen des Cache können unterschiedliche Parameter wie die maximale Größe, die Zeit ab der ein Eintrag erneuert wird und der CacheLoader definiert werden. Der CacheLoader implementiert die Methode load, welche die entsprechenden Daten vom Webservice bezieht. Nachdem der LoadingCache definiert ist, kann die Map normal genutzt werden:

BookData bookData = books.get("9783736889842");

Im Hintergrund wird der Wert, wenn vorhanden, aus dem Cache bezogen. Ist dies nicht der Fall wird stattdessen der CacheLoader genutzt, welcher in diesem Beispiel einen Request an den Webservice sendet und das Ergebnis wieder im Cache hinterlegt. Der LoadingCache selber beschränkt sich auf die Laufzeit der Applikation und wird nicht persistiert.

Case-sensitives Startvolume unter macOS

Vor einigen Tagen schrieb ich darüber das Steam unter macOS nicht mit einem Dateisystem funktioniert, wenn dieses case-sensitiv ist. Dass bedeutet das die Dateien test.txt und Test.txt zwei unterschiedliche Dateien aus Sicht des Betriebssystems sind. Bei case-insensitiven Systemen hingegen, wären dies die gleichen Dateien. Wird die case-sensitive Variante als Startvolume unter macOS betrieben so führt dies mittelfristig nur zu Problemen.

Das Startvolume unter macOS sollte im case-insensitiven Modus formatiert werden

Hintergrund ist das besagte Apps wie Steam oder die Adobe Suite mit einem case-sensitiven Dateisystem nicht zurechtkommen. Dies führt im einfachsten Fall dazu das die Applikation nicht startet, kann aber wie z.B. bei Nextcloud zu seltsamen Abstürzen führen. Als Lösung für dieses Problem bietet sich leider nur die Neuinstallation mit der case-insensitiven Variante von APFS an.

Telemetrie im Visual Studio Code deaktivieren

Visual Studio Code ist ein beliebter Quelltext-Editor welcher von Microsoft entwickelt wurde und unter der MIT-Lizenz lizenziert wurde und damit freie Software ist. Allerdings hat der Editor einige Features, welche im Zusammenhang mit Datensparsamkeit und Datenschutz eher suboptimal sind. Einer dieser Features ist die Telemetrieübertragung, welche dazu dient Informationen über die Nutzung von Visual Studio Code zu sammeln. Glücklicherweise kann diese Übertragung deaktiviert werden.

Die Telemetrie-Einstellungen im Visual Studio Code

Dazu müssen die Einstellungen geöffnet werden und dort nach der Zeichenkette telemetry.enableTelemetry gesucht werden. Anschließend findet sich dort eine Checkbox mit der die Telemetrieübertragung deaktiviert werden kann.

Batterie einer mobilen Apple-Rechners kalibrieren

Bei der Nutzung eines mobilen Apple-Rechners, wie z.B. einem MacBook Air, ist es ratsam den Akku bzw. die Batterie desselbigen ab und an zu kalibrieren. Damit ist sichergestellt das die Anzeige der noch verbleibenden Energie korrekt dargestellt wird. Zur Kalibrierung müssen bestimmte Schritte in einer definierten Reihenfolge ausgeführt werden. Im ersten Schritt muss das Gerät auf 100 Prozent geladen werden. Danach muss das Gerät mindestens zwei weitere Stunden geladen werden. Anschließend kann der Ladestecker entfernt werden.

Die Akku-Zellen bei einem MacBook Air

Nun kann das Gerät normal genutzt werden, bis die Warnung erscheint die davor warnt, dass die Batterie bald leer ist. Das Gerät muss nun solange genutzt werden, bis es sich von Selbst abschaltet. Nachdem das Gerät sich abgeschaltet hat, muss es für mindestens 5 Stunden in diesem Zustand belassen werden. Anschließend muss das Gerät in einem Rutsch auf 100 Prozent geladen werden. Das Gerät sollte anschließend weitere zwei Stunden am Netzteil betrieben werden. Danach ist die Kalibrierung abgeschlossen. Wird einer dieser Schritte unterbrochen, muss die Kalibrierung erneut, von Beginn an, durchgeführt werden.