Neuigkeiten von trion.
Immer gut informiert.

YAML als API in Spring Boot RestController

Dank Spring Boot ist die Erstellung von Java basierten Anwendungen und Microservices extrem leicht geworden: Mit Spring Initializr ( https://start.spring.io ) ist eine API Anwendung schnell erstellt. Sinnvolle Standardeinstellungen und eine gute Entwicklerproduktivität machen Spring Boot auch im weiteren Verlauf eines Softwareprojekts zu einer beliebten Plattform.

Doch was ist, wenn man von den vorgegebenen Pfaden abweichen will?
Spring Boot zeigt sich hier flexibel: Am Beispiel von YAML als Datenformat für unsere Anwendung schauen wir uns das einmal genauer an.

Spring Boot verwendet standardmäßig Jackson zur Serialisierung bzw. Deserialisierung. Wird die Library auf dem Classpath entdeckt, dann wird eine automatische Konfiguration vorgenommen.

Wollen wir nun zusätzlich YAML unterstützen, so wird für Jackson zunächst der YAML Support benötigt. Die passende Library ist jackson-dataformat-yaml. Bei Maven wird diese einfach im pom.xml als Dependency aufgenommen.

Maven Dependency für Jackson Dataformat-YAML
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

Anders, als bei JSON erfolgt für YAML keine automatische Konfiguration. Wir konfigurieren daher in Form eines WebMvcConfigurer den Media-Type, bei dem das YAML Format verwendet werden soll. Außerdem muss ein in Form eines Spring HttpMessageConverter eine Implementierung bereitgestellt werden, der mit diesem Media-Type umgehen kann. Jackson liefert dazu einen Adapter, mit dem ein Jackson ObjectMapper zu dem von Spring benötigten HttpMessageConverter adaptiert wird.

Jackson liefert als Implementierung des ObjectMapper für YAML passend einen YAMLMapper. Auch dieser kann noch weiter konfiguriert werden, um z.B. für Java 8 Streams und Optional durch das Jdk8Module oder für die neue Date und Time API mit dem JavaTimeModule Unterstützung zu bekommen.
Ebenso kann auf die Serialisierung Datum Zeit Einfluss genommen werden, so dass diese als ISO-String statt als Millisekunden dargestellt werden.

WebMvcConfiguration um YAML Support mit Jackson zu konfigurieren
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer
{
    private static final MediaType MEDIA_TYPE_YAML = MediaType.valueOf("application/yaml");
    private static final MediaType MEDIA_TYPE_YML = MediaType.valueOf("application/yml");

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
    {
        configurer
           .mediaType(MEDIA_TYPE_YML.getSubtype(), MEDIA_TYPE_YML)
           .mediaType(MEDIA_TYPE_YAML.getSubtype(), MEDIA_TYPE_YAML);
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters)
    {
        YAMLMapper yamlMapper = new YAMLMapper();
        yamlMapper.registerModule(new Jdk8Module());
        yamlMapper.registerModule(new JavaTimeModule());
        yamlMapper.configure(WRITE_DATES_AS_TIMESTAMPS, false);

        MappingJackson2HttpMessageConverter yamlConverter = new MappingJackson2HttpMessageConverter(yamlMapper);
        yamlConverter.setSupportedMediaTypes(
           Arrays.asList(MEDIA_TYPE_YML, MEDIA_TYPE_YAML)
        );
        converters.add(yamlConverter);
    }
}

Ist erst einmal alles konfiguriert, kann man nun, mit einem entsprechenden Content-Type, einen Abruf im YAML Format vornehmen.

Aufruf mit httpie und cURL
$ http GET :8080/chat Accept:application/yaml
HTTP/1.1 200
Content-Type: application/yaml

---
- sender: "Spring Boot Chat"
  time: "2020-05-29T18:26:33.073638"
  message: "huhu!"

$ curl -H "Accept: application/yaml"  http://localhost:8080/
---
- sender: "Spring Boot Chat"
  time: "2020-05-29T18:29:12.343517"
  message: "huhu!"

Das YAML Format ist vor allem dann praktisch, wenn darüber Konfigurationen abgebildet werden, und diese auch durch Menschen bereitgestellt und bearbeitet werden. Im Gegensatz zu JSON ist die Lesbarkeit spürbar besser und die Erstellung von YAML ist mit geeigneten Werkzeugen sehr effizient und fehlerarm möglich.




Zu den Themen Spring Boot, Spring Framework und Java bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Zur Desktop Version des Artikels