{"id":463,"date":"2024-06-24T16:03:23","date_gmt":"2024-06-24T15:03:23","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=463"},"modified":"2024-07-04T16:10:35","modified_gmt":"2024-07-04T15:10:35","slug":"mapping-von-java-datenstrukturen-mit-der-mapstruct-library","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=463","title":{"rendered":"Mapping von Java-Datenstrukturen mit der Mapstruct-Library"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Einleitung<\/h4>\n\n\n\n<p>In der Softwareentwicklung ist das Mapping von Datenstrukturen eine g\u00e4ngige Anforderung, insbesondere in Anwendungen, die Daten zwischen verschiedenen Schichten austauschen. Java-Entwickler stehen h\u00e4ufig vor der Herausforderung, komplexe Objekte von einer Form in eine andere zu transformieren. Dabei kann es sich beispielsweise um die Umwandlung von Datenbankentit\u00e4ten in DTOs (Data Transfer Objects) handeln oder um die Transformation von API-Requests in Dom\u00e4nenobjekte.<\/p>\n\n\n\n<p>Um diesen Prozess effizienter und weniger fehleranf\u00e4llig zu gestalten, bietet die Mapstruct-Library eine leistungsstarke und flexible L\u00f6sung. Mapstruct ist eine Java-basierte Annotation-Processor-Bibliothek, die zur Kompilierzeit Mapping-Code generiert. In diesem Artikel werden wir die grundlegenden Konzepte von Mapstruct, deren Konfiguration und einige erweiterte Funktionen durchgehen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Grundlagen von Mapstruct<\/h4>\n\n\n\n<p>Mapstruct zielt darauf ab, den m\u00fchsamen und fehleranf\u00e4lligen Prozess des Schreibens von Mapping-Code zu automatisieren. Dies wird durch den Einsatz von Annotationen erreicht, die an den Mapping-Schnittstellen und Methoden definiert werden. Diese Annotationen werden zur Kompilierzeit verarbeitet, um den notwendigen Code zu generieren, der die Mappings ausf\u00fchrt.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Installation und Konfiguration<\/h5>\n\n\n\n<p>Um Mapstruct in einem Java-Projekt zu verwenden, m\u00fcssen zun\u00e4chst die notwendigen Abh\u00e4ngigkeiten in der <code>pom.xml<\/code> (f\u00fcr Maven) oder <code>build.gradle<\/code> (f\u00fcr Gradle) hinzugef\u00fcgt werden. Ein Beispiel f\u00fcr Maven:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" 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\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.mapstruct<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>mapstruct<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>1.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\">dependency<\/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>org.mapstruct<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>mapstruct-processor<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>1.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\">scope<\/span>&gt;<\/span>provided<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><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>F\u00fcr Gradle sieht die Konfiguration \u00e4hnlich aus:<\/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\">implementation <span class=\"hljs-string\">'org.mapstruct:mapstruct:1.5.0'<\/span>\nannotationProcessor <span class=\"hljs-string\">'org.mapstruct:mapstruct-processor:1.5.0'<\/span><\/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<h5 class=\"wp-block-heading\">Erstellen von Mapper-Interfaces<\/h5>\n\n\n\n<p>Ein grundlegendes Beispiel f\u00fcr einen Mapper k\u00f6nnte die Transformation zwischen einem <code>User<\/code>-Entit\u00e4t und einem <code>UserDTO<\/code> sein. Zuerst definieren wir die beiden Klassen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> Long id;\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    <span class=\"hljs-keyword\">private<\/span> String email;\n    <span class=\"hljs-comment\">\/\/ Getter und Setter<\/span>\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UserDTO<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> Long id;\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    <span class=\"hljs-comment\">\/\/ Getter und Setter<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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\n<p>Nun definieren wir ein Mapper-Interface, das Mapstruct verwendet, um die Konvertierung durchzuf\u00fchren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> org.mapstruct.Mapper;\n<span class=\"hljs-keyword\">import<\/span> org.mapstruct.factory.Mappers;\n\n@Mapper\npublic interface UserMapper {\n    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);\n\n    UserDTO userToUserDTO(User user);\n    User userDTOToUser(UserDTO userDTO);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>Durch die Annotation <code>@Mapper<\/code> und die Methode <code>Mappers.getMapper(UserMapper.class)<\/code> wird Mapstruct angewiesen, die Implementierung dieses Interfaces zur Kompilierzeit zu generieren.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Nutzung des Mappers<\/h5>\n\n\n\n<p>Die Verwendung des generierten Mappers ist unkompliziert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UserService<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> UserDTO getUserDTO(User user) {\n        <span class=\"hljs-keyword\">return<\/span> UserMapper.INSTANCE.userToUserDTO(user);\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\">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\n<h4 class=\"wp-block-heading\">Erweiterte Mapstruct-Funktionen<\/h4>\n\n\n\n<p>Neben den grundlegenden Mappings bietet Mapstruct eine Reihe erweiterter Funktionen, um komplexere Anforderungen abzudecken.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Anpassung von Mappings<\/h5>\n\n\n\n<p>Manchmal erfordern Mappings benutzerdefinierte Logik oder spezifische Anpassungen. Dies kann durch die Verwendung von <code>@Mapping<\/code>-Annotationen erreicht werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.mapstruct<\/span><span class=\"hljs-selector-class\">.Mapping<\/span>;\n\n<span class=\"hljs-keyword\">@Mapper<\/span>\npublic interface UserMapper {\n    <span class=\"hljs-keyword\">@Mapping<\/span>(source = <span class=\"hljs-string\">\"email\"<\/span>, target = <span class=\"hljs-string\">\"contactEmail\"<\/span>)\n    UserDTO userToUserDTO(User user);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird das <code>email<\/code>-Feld des <code>User<\/code>-Objekts auf das <code>contactEmail<\/code>-Feld des <code>UserDTO<\/code>-Objekts gemappt.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Verwendung von Expression und Default Values<\/h5>\n\n\n\n<p>F\u00fcr komplexere Transformationen kann die <code>expression<\/code>-Eigenschaft der <code>@Mapping<\/code>-Annotation verwendet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@Mapping<\/span>(target = <span class=\"hljs-string\">\"fullName\"<\/span>, expression = <span class=\"hljs-string\">\"java(user.getFirstName() + ' ' + user.getLastName())\"<\/span>)\nUserDTO userToUserDTO(User user);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Auch Standardwerte k\u00f6nnen gesetzt werden, falls ein Quellfeld null ist:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@Mapping<\/span>(target = <span class=\"hljs-string\">\"status\"<\/span>, defaultValue = <span class=\"hljs-string\">\"ACTIVE\"<\/span>)\nUserDTO userToUserDTO(User user);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">Collection Mappings<\/h5>\n\n\n\n<p>Mapstruct unterst\u00fctzt auch das Mapping von Collections wie Listen und Sets:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Mapper\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">UserMapper<\/span> <\/span>{\n    <span class=\"hljs-keyword\">List<\/span>&lt;UserDTO&gt; usersToUserDTOs(<span class=\"hljs-keyword\">List<\/span>&lt;User&gt; users);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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\n<h5 class=\"wp-block-heading\">Nested Mappings<\/h5>\n\n\n\n<p>Bei verschachtelten Objekten kann Mapstruct automatisch die entsprechenden Unterobjekte mappen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Address<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> String street;\n    <span class=\"hljs-keyword\">private<\/span> String city;\n    <span class=\"hljs-comment\">\/\/ Getter und Setter<\/span>\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> Long id;\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    <span class=\"hljs-keyword\">private<\/span> Address address;\n    <span class=\"hljs-comment\">\/\/ Getter und Setter<\/span>\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UserDTO<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> Long id;\n    <span class=\"hljs-keyword\">private<\/span> String name;\n    <span class=\"hljs-keyword\">private<\/span> String street;\n    <span class=\"hljs-keyword\">private<\/span> String city;\n    <span class=\"hljs-comment\">\/\/ Getter und Setter<\/span>\n}\n\n@Mapper\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">UserMapper<\/span> <\/span>{\n    @Mapping(source = <span class=\"hljs-string\">\"address.street\"<\/span>, target = <span class=\"hljs-string\">\"street\"<\/span>)\n    @Mapping(source = <span class=\"hljs-string\">\"address.city\"<\/span>, target = <span class=\"hljs-string\">\"city\"<\/span>)\n    UserDTO userToUserDTO(User user);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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\n<p>In diesem Beispiel werden die Felder des verschachtelten <code>Address<\/code>-Objekts auf die entsprechenden Felder im <code>UserDTO<\/code> gemappt.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Vor- und Nachbearbeitungsmethoden<\/h5>\n\n\n\n<p>Manchmal ist es notwendig, zus\u00e4tzliche Logik vor oder nach dem Mapping-Prozess auszuf\u00fchren. Hierf\u00fcr bietet Mapstruct die <code>@BeforeMapping<\/code> und <code>@AfterMapping<\/code>-Annotationen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@Mapper<\/span>\npublic interface UserMapper {\n\n    <span class=\"hljs-keyword\">@AfterMapping<\/span>\n    default void afterMapping(User user, @MappingTarget UserDTO userDTO) {\n        <span class=\"hljs-selector-tag\">userDTO<\/span><span class=\"hljs-selector-class\">.setFullName<\/span>(<span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.getFirstName<\/span>() + \" \" + <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.getLastName<\/span>());\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p>Mapstruct ist eine leistungsstarke Bibliothek, die den Aufwand f\u00fcr das Schreiben und Pflegen von Mapping-Code erheblich reduziert. Durch die Annotation-basierte Konfiguration und die automatische Codegenerierung zur Kompilierzeit wird der Mapping-Prozess nicht nur schneller, sondern auch weniger fehleranf\u00e4llig. Die Unterst\u00fctzung f\u00fcr komplexe Mappings, benutzerdefinierte Logik und Erweiterbarkeit machen Mapstruct zu einer wertvollen Erg\u00e4nzung im Werkzeugkasten eines jeden Java-Entwicklers.<\/p>\n\n\n\n<p>Obwohl dieser Artikel nur die grundlegenden und einige erweiterte Funktionen von Mapstruct behandelt, gibt es noch viele weitere Aspekte zu entdecken, wie die Integration mit anderen Frameworks, komplexere Mapping-Strategien und Optimierungen. Entwickler sind daher eingeladen, die offizielle Dokumentation und weitere Ressourcen zu konsultieren, um das volle Potenzial von Mapstruct auszusch\u00f6pfen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung In der Softwareentwicklung ist das Mapping von Datenstrukturen eine g\u00e4ngige Anforderung, insbesondere in Anwendungen, die Daten zwischen verschiedenen Schichten austauschen. Java-Entwickler stehen h\u00e4ufig vor der Herausforderung, komplexe Objekte von einer Form in eine andere zu transformieren. Dabei kann es sich beispielsweise um die Umwandlung von Datenbankentit\u00e4ten in DTOs (Data Transfer Objects) handeln oder um [&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-463","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\/463","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=463"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/463\/revisions"}],"predecessor-version":[{"id":464,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/463\/revisions\/464"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}