{"id":691,"date":"2026-06-14T23:30:34","date_gmt":"2026-06-14T22:30:34","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=691"},"modified":"2026-07-07T23:31:40","modified_gmt":"2026-07-07T22:31:40","slug":"helidon-4-5-der-schlanke-cloud-native-java-stack-mit-virtual-threads","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=691","title":{"rendered":"Helidon 4.5 \u2013 Der schlanke Cloud-native Java-Stack mit Virtual Threads"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Wenn Java-Entwickler an Microservices denken, fallen zuerst Quarkus und Micronaut. Doch seit Version 4 hat Oracle&#8217;s Helidon einen bemerkenswerten Wandel vollzogen: Es ist das erste Java-Webframework, das vollst\u00e4ndig auf Virtual Threads (Project Loom) basiert \u2014 und bietet damit eine erfrischende Alternative zum reaktiven Programmiermodell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel zeigt dir den Einstieg in Helidon 4.5 und erkl\u00e4rt, warum der \u201eBlocking-Code auf Virtual Threads&#8220;-Ansatz das Leben von Microservice-Entwicklern einfacher macht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist Helidon?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Helidon (griechisch f\u00fcr Schwalbe \u2014 ein kleiner, wendiger Vogel) gibt es in zwei Flavors:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Flavor<\/th><th class=\"has-text-align-left\" data-align=\"left\">Beschreibung<\/th><\/tr><\/thead><tbody><tr><td><strong>Helidon SE<\/strong><\/td><td>Funktionaler, expliziter Stil ohne Framework-Magie. Kleinster Footprint (~34 MB native).<\/td><\/tr><tr><td><strong>Helidon MP<\/strong><\/td><td>MicroProfile-kompatibel mit CDI, JAX-RS, JSON-P\/B. F\u00fcr Jakarta-EE-erfahrene Teams.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Beide teilen sich den Helidon WebServer als Kern und unterst\u00fctzen Java 21+ sowie GraalVM Native Image. Der aktuelle Release ist&nbsp;<strong>Helidon 4.5.0<\/strong>&nbsp;(Juni 2025).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der Clou: Virtual Threads statt Reactive<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das reaktive Programmierparadigma (Project Reactor, RxJava, Mutiny) hat ein echtes Problem: Der Code wird schwer lesbar, Stacktraces werden unbrauchbar, und Debugging wird zur Qual. Helidon 4 l\u00f6st das anders: Es verwendet Java Virtual Threads, die bei I\/O-Operationen automatisch vom JVM-Scheduler suspendiert werden, ohne Plattform-Threads zu blockieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Resultat:<\/strong>&nbsp;Du schreibst ganz normalen, blockierenden Code \u2014 und die JVM macht ihn hochskalierend.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ In Spring WebFlux (reaktiv):&lt;\/em&gt;<\/span>\n<span class=\"hljs-keyword\">return<\/span> userRepository.findById(id)\n    .flatMap(user -&gt; orderService.findOrders(user))\n    .map(orders -&gt; <span class=\"hljs-keyword\">new<\/span> UserWithOrders(user, orders));\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ In Helidon (blockierend auf Virtual Threads):<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<span class=\"hljs-keyword\">var<\/span> user = userRepository.findById(id);\n<span class=\"hljs-keyword\">var<\/span> orders = orderService.findOrders(user);\n<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> UserWithOrders(user, orders);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Beide Varianten skalieren auf Millionen gleichzeitiger Verbindungen \u2014 aber nur eine liest sich wie normaler Java-Code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quickstart: ein REST-Endpunkt mit Helidon SE<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Projekt mit der Helidon CLI erstellen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -L -O https:<span class=\"hljs-comment\">\/\/helidon.io\/cli\/latest\/darwin\/helidon<\/span>\nchmod +x helidon &amp;&amp; sudo mv helidon \/usr\/local\/bin\/\n\nhelidon init --batch -Dflavor=se -Dapp-type=quickstart\ncd quickstart-se &amp;&amp; mvn clean package -Pjre\njava -jar target\/quickstart-se.jar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Die generierte&nbsp;<code>Main.java<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.helidon.webserver.WebServer;\n<span class=\"hljs-keyword\">import<\/span> io.helidon.webserver.http.HttpRouting;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        WebServer.builder()\n            .port(<span class=\"hljs-number\">8080<\/span>)\n            .addRouting(HttpRouting.builder()\n                .get(<span class=\"hljs-string\">\"\/greet\"<\/span>, (req, res) -&gt; res.send(<span class=\"hljs-string\">\"Hallo Helidon!\"<\/span>))\n                .get(<span class=\"hljs-string\">\"\/greet\/{name}\"<\/span>, (req, res) -&gt; {\n                    <span class=\"hljs-built_in\">String<\/span> name = req.path().pathParameters().get(<span class=\"hljs-string\">\"name\"<\/span>);\n                    res.send(<span class=\"hljs-string\">\"Hallo \"<\/span> + name + <span class=\"hljs-string\">\"!\"<\/span>);\n                })\n            )\n            .build()\n            .start();\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Noch simpler geht&#8217;s kaum. Der Server startet in ~0,6 Sekunden, und jede Anfrage l\u00e4uft auf einem eigenen Virtual Thread.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eine kleine REST-API mit Services<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">So sieht eine vollst\u00e4ndige Todo-API mit Dependency Injection (Helidon Inject) und JSON-Serialisierung aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ Todo.java \u2014 Modell&lt;\/em&gt;<\/span>\n<span class=\"hljs-keyword\">public<\/span> record Todo(String id, String task, boolean done) {}\n\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ TodoService.java \u2014 Business-Logik&lt;\/em&gt;<\/span>\n@Singleton\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TodoService<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> Map&lt;String, Todo&gt; todos = <span class=\"hljs-keyword\">new<\/span> ConcurrentHashMap&lt;&gt;();\n\n    <span class=\"hljs-keyword\">public<\/span> TodoService() {\n        add(<span class=\"hljs-keyword\">new<\/span> Todo(<span class=\"hljs-string\">\"1\"<\/span>, <span class=\"hljs-string\">\"Helidon lernen\"<\/span>, <span class=\"hljs-keyword\">false<\/span>));\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">List<\/span>&lt;Todo&gt; <span class=\"hljs-keyword\">list<\/span>() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">List<\/span>.copyOf(todos.values());\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> Todo add(Todo todo) {\n        todos.put(todo.id(), todo);\n        <span class=\"hljs-keyword\">return<\/span> todo;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;em&gt;<span class=\"hljs-comment\">\/\/ TodoRoutes.java \u2014 HTTP-Endpunkte&lt;\/em&gt;<\/span>\n<span class=\"hljs-keyword\">import<\/span> io.helidon.webserver.http.HttpRules;\n<span class=\"hljs-keyword\">import<\/span> io.helidon.webserver.http.HttpService;\n<span class=\"hljs-keyword\">import<\/span> io.helidon.webserver.http.ServerRequest;\n<span class=\"hljs-keyword\">import<\/span> io.helidon.webserver.http.ServerResponse;\n<span class=\"hljs-keyword\">import<\/span> jakarta.json.Json;\n<span class=\"hljs-keyword\">import<\/span> jakarta.json.JsonArrayBuilder;\n<span class=\"hljs-keyword\">import<\/span> jakarta.json.JsonObject;\n\n@Singleton\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TodoRoutes<\/span> <span class=\"hljs-title\">implements<\/span> <span class=\"hljs-title\">HttpService<\/span> <\/span>{\n\n    private final TodoService service;\n\n    @Inject\n    public TodoRoutes(TodoService service) {\n        <span class=\"hljs-keyword\">this<\/span>.service = service;\n    }\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> routing(HttpRules rules) {\n        rules.get(<span class=\"hljs-string\">\"\/todos\"<\/span>, <span class=\"hljs-attr\">this<\/span>::getAll)\n               .post(<span class=\"hljs-string\">\"\/todos\"<\/span>, <span class=\"hljs-attr\">this<\/span>::create);\n    }\n\n    private <span class=\"hljs-keyword\">void<\/span> getAll(ServerRequest req, ServerResponse res) {\n        <span class=\"hljs-keyword\">var<\/span> json = service.list().stream()\n            .map(t -&gt; Json.createObjectBuilder()\n                .add(<span class=\"hljs-string\">\"id\"<\/span>, t.id())\n                .add(<span class=\"hljs-string\">\"task\"<\/span>, t.task())\n                .add(<span class=\"hljs-string\">\"done\"<\/span>, t.done())\n                .build())\n            .collect(Json.createArrayBuilder(), <span class=\"hljs-attr\">JsonArrayBuilder<\/span>::add, (a, b) -&gt; {})\n            .build();\n        res.header(<span class=\"hljs-string\">\"Content-Type\"<\/span>, <span class=\"hljs-string\">\"application\/json\"<\/span>).send(json);\n    }\n\n    private <span class=\"hljs-keyword\">void<\/span> create(ServerRequest req, ServerResponse res) {\n        JsonObject body = req.content().as(JsonObject.class);\n        Todo todo = service.add(<span class=\"hljs-keyword\">new<\/span> Todo(\n            UUID.randomUUID().toString(),\n            body.getString(<span class=\"hljs-string\">\"task\"<\/span>),\n            <span class=\"hljs-literal\">false<\/span>\n        ));\n        res.status(<span class=\"hljs-number\">201<\/span>).send(todo);\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Virtual-Thread-Architektur unter der Haube<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Helidon 4&#8217;s Server (urspr\u00fcnglich unter dem Codenamen \u201eN\u00edma&#8220; entwickelt) verwendet folgendes Thread-Modell:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Socket-Listener<\/strong>\u00a0laufen auf Plattform-Threads (ein Thread pro Server-Socket)<\/li>\n\n\n\n<li><strong>HTTP\/1.1<\/strong>: Ein Virtual Thread pro Verbindung (bearbeitet Routing + alle Requests)<\/li>\n\n\n\n<li><strong>HTTP\/2<\/strong>: Ein Virtual Thread pro Stream \u2014 jeder Stream bekommt Routing auf einem eigenen Thread<\/li>\n\n\n\n<li>Der JVM-Scheduler multiplexiert Millionen Virtual Threads auf wenige OS-Threads<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Das bedeutet: Du kannst Code wie&nbsp;<code>Thread.sleep()<\/code>&nbsp;oder&nbsp;<code>blockingRepository.findById()<\/code>&nbsp;ganz normal aufrufen, ohne Angst vor Thread-Pool-Ersch\u00f6pfung. Der Virtual Thread wird suspendiert, der Carrier-Thread arbeitet weiter an einem anderen Virtual Thread, und sobald das I\/O bereit ist, l\u00e4uft dein Code weiter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Performance &amp; GraalVM Native Image<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Helidon SE gl\u00e4nzt mit beeindruckenden Werten:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Metrik<\/th><th class=\"has-text-align-left\" data-align=\"left\">JVM<\/th><th class=\"has-text-align-left\" data-align=\"left\">Native Image<\/th><\/tr><\/thead><tbody><tr><td>Speicher (RSS)<\/td><td>~70 MB<\/td><td>~34 MB<\/td><\/tr><tr><td>Startup-Zeit<\/td><td>0,6 s<\/td><td>0,06 s<\/td><\/tr><tr><td>Artefaktgr\u00f6\u00dfe<\/td><td>333 MB<\/td><td>38 MB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mit GraalVM Native Image lassen sich sub-100ms Startup-Zeiten erreichen \u2014 ideal f\u00fcr Serverless und Auto-Scaling. Das native Image baust du mit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mvn package -Pnative\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Helidon SE vs. Helidon MP: Wann welchen Flavor?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Helidon SE<\/strong>\u00a0eignet sich f\u00fcr Teams, die maximale Kontrolle und minimalen Footprint wollen. Keine Annotation-Magie, kein CDI-Overhead, direkte APIs.<\/li>\n\n\n\n<li><strong>Helidon MP<\/strong>\u00a0ist ideal f\u00fcr Teams mit Jakarta-EE-Hintergrund oder wenn MicroProfile-Standards (Health, Metrics, OpenAPI, Config) gefordert sind.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Maven BOM f\u00fcr eigene Projekte<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencyManagement<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.helidon<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>helidon-bom<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>4.5.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type<\/span>&gt;<\/span>pom<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">type<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencyManagement<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Helidon 4 beweist, dass Java-Microservices nicht reaktiv sein m\u00fcssen, um hochskalierend zu sein. Virtual Threads erlauben sauberen, debuggaren Code mit vergleichbarer Performance. Besonders Helidon SE besticht durch seine Einfachheit: Keine Reflexion, keine Annotation-Prozessoren, keine Framework-Magie \u2014 nur Java, so wie du es kennst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den n\u00e4chsten Microservice solltet ihr Helidon definitiv auf der Shortlist haben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Java-Entwickler an Microservices denken, fallen zuerst Quarkus und Micronaut. Doch seit Version 4 hat Oracle&#8217;s Helidon einen bemerkenswerten Wandel vollzogen: Es ist das erste Java-Webframework, das vollst\u00e4ndig auf Virtual Threads (Project Loom) basiert \u2014 und bietet damit eine erfrischende Alternative zum reaktiven Programmiermodell. Dieser Artikel zeigt dir den Einstieg in Helidon 4.5 und erkl\u00e4rt, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-691","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=691"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/691\/revisions"}],"predecessor-version":[{"id":692,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/691\/revisions\/692"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=691"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}