{"id":178,"date":"2024-01-21T00:39:54","date_gmt":"2024-01-20T23:39:54","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=178"},"modified":"2024-01-24T00:40:37","modified_gmt":"2024-01-23T23:40:37","slug":"konfiguration-des-jackson-objectmapper-in-einer-spring-anwendung","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=178","title":{"rendered":"Konfiguration des Jackson-ObjectMapper in einer Spring-Anwendung"},"content":{"rendered":"\n<p>Die Jackson-Bibliothek ist ein leistungsf\u00e4higes Werkzeug f\u00fcr die Serialisierung und Deserialisierung von JSON-Daten in Java-Anwendungen. In einer Spring-Anwendung wird die ObjectMapper-Klasse von Jackson oft verwendet, um zwischen JSON und Java-Objekten zu konvertieren. Die Konfiguration dieses ObjectMapper ist entscheidend, um die gew\u00fcnschten Ergebnisse zu erzielen und die Anforderungen der Anwendung zu erf\u00fcllen. In diesem Artikel werden verschiedene M\u00f6glichkeiten zur Konfiguration des ObjectMapper in einer Spring-Anwendung behandelt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Einf\u00fchrung in den ObjectMapper<\/h2>\n\n\n\n<p>Der ObjectMapper ist das zentrale Element in Jackson, das f\u00fcr die Konvertierung von JSON-Daten in Java-Objekte (Deserialisierung) und umgekehrt (Serialisierung) verantwortlich ist. In einer Spring-Anwendung wird der ObjectMapper h\u00e4ufig automatisch durch Spring Boot konfiguriert, aber es gibt viele F\u00e4lle, in denen eine benutzerdefinierte Konfiguration erforderlich ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Standardkonfiguration von Spring Boot<\/h2>\n\n\n\n<p>In den meisten Spring-Anwendungen wird der ObjectMapper automatisch von Spring Boot konfiguriert. Spring Boot verwendet Jackson als Standard-JSON-Bibliothek und bietet eine sinnvolle Standardkonfiguration. Die meisten grundlegenden Anforderungen k\u00f6nnen bereits durch diese Konfiguration erf\u00fcllt werden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Configuration\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JacksonConfig<\/span> <\/span>{\n    @Primary\n    @Bean\n    <span class=\"hljs-keyword\">public<\/span> ObjectMapper objectMapper() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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>Durch das Hinzuf\u00fcgen des <code>@Primary<\/code>-Annotations wird sichergestellt, dass diese Bean als bevorzugte Quelle f\u00fcr den ObjectMapper verwendet wird. Spring Boot stellt auch viele Eigenschaften in der <code>application.properties<\/code> oder <code>application.yml<\/code> Datei bereit, um die Jackson-Konfiguration anzupassen.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spring.jackson.date-format=yyyy-MM-dd HH:mm:ss\nspring.jackson.time-zone=UTC<\/code><\/span><\/pre>\n\n\n<p>Diese Eigenschaften k\u00f6nnen dazu verwendet werden, das Datumsformat und die Zeitzone f\u00fcr die Serialisierung zu konfigurieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Anpassung von Serialisierungs- und Deserialisierungsoptionen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1. Eigene Serializer und Deserializer<\/h3>\n\n\n\n<p>Manchmal m\u00fcssen Sie spezifische Anforderungen an die Serialisierung oder Deserialisierung haben. In solchen F\u00e4llen k\u00f6nnen Sie benutzerdefinierte Serializer und Deserializer erstellen und diese dem ObjectMapper hinzuf\u00fcgen.<\/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\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomDateSerializer<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">JsonSerializer<\/span>&lt;<span class=\"hljs-title\">Date<\/span>&gt; <\/span>{\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> serialize(<span class=\"hljs-built_in\">Date<\/span> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {\n        SimpleDateFormat formatter = <span class=\"hljs-keyword\">new<\/span> SimpleDateFormat(<span class=\"hljs-string\">\"dd-MM-yyyy\"<\/span>);\n        gen.writeString(formatter.format(value));\n    }\n}\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomDateDeserializer<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">JsonDeserializer<\/span>&lt;<span class=\"hljs-title\">Date<\/span>&gt; <\/span>{\n    @Override\n    public <span class=\"hljs-built_in\">Date<\/span> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {\n        SimpleDateFormat formatter = <span class=\"hljs-keyword\">new<\/span> SimpleDateFormat(<span class=\"hljs-string\">\"dd-MM-yyyy\"<\/span>);\n        <span class=\"hljs-built_in\">String<\/span> dateStr = p.getValueAsString();\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-keyword\">return<\/span> formatter.parse(dateStr);\n        } <span class=\"hljs-keyword\">catch<\/span> (ParseException e) {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(e);\n        }\n    }\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>F\u00fcgen Sie dann diese Serializer und Deserializer dem ObjectMapper hinzu:<\/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\">@Configuration\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JacksonConfig<\/span> <\/span>{\n    @Primary\n    @Bean\n    public ObjectMapper objectMapper() {\n        ObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n        SimpleModule simpleModule = <span class=\"hljs-keyword\">new<\/span> SimpleModule();\n        simpleModule.addSerializer(<span class=\"hljs-built_in\">Date<\/span>.class, <span class=\"hljs-keyword\">new<\/span> CustomDateSerializer());\n        simpleModule.addDeserializer(<span class=\"hljs-built_in\">Date<\/span>.class, <span class=\"hljs-keyword\">new<\/span> CustomDateDeserializer());\n        objectMapper.registerModule(simpleModule);\n        <span class=\"hljs-keyword\">return<\/span> objectMapper;\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<h3 class=\"wp-block-heading\">3.2. Anpassung von Sichtbarkeitseinstellungen<\/h3>\n\n\n\n<p>Standardm\u00e4\u00dfig serialisiert Jackson alle Felder eines Objekts, auch private Felder. Wenn Sie die Sichtbarkeit anpassen m\u00fcssen, k\u00f6nnen Sie dies mit den Annotationen <code>@JsonAutoDetect<\/code> und <code>@JsonProperty<\/code> tun.<\/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\">@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomObject<\/span> <\/span>{\n    @JsonProperty(<span class=\"hljs-string\">\"customName\"<\/span>)\n    <span class=\"hljs-keyword\">private<\/span> String name;\n\n    <span class=\"hljs-comment\">\/\/ getters and setters<\/span>\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\n<h2 class=\"wp-block-heading\">4. Konfiguration von Features und Modulen<\/h2>\n\n\n\n<p>Jackson bietet verschiedene Features und Module, die aktiviert oder deaktiviert werden k\u00f6nnen, um das Verhalten des ObjectMapper anzupassen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1. Features aktivieren\/deaktivieren<\/h3>\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\">@Configuration\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JacksonConfig<\/span> <\/span>{\n    @Primary\n    @Bean\n    <span class=\"hljs-keyword\">public<\/span> ObjectMapper objectMapper() {\n        ObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);\n        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);\n        <span class=\"hljs-keyword\">return<\/span> objectMapper;\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<p>Hier werden zwei Features deaktiviert bzw. aktiviert: die Serialisierung von Daten als Zeitstempel und die Akzeptanz einzelner Werte als Arrays w\u00e4hrend der Deserialisierung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.2. Module hinzuf\u00fcgen<\/h3>\n\n\n\n<p>Jackson-Module k\u00f6nnen verwendet werden, um zus\u00e4tzliche Funktionen zu aktivieren, z.B. das Hinzuf\u00fcgen von benutzerdefinierten Serializern\/Deserializern f\u00fcr bestimmte Typen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Configuration\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JacksonConfig<\/span> <\/span>{\n    @Primary\n    @Bean\n    <span class=\"hljs-keyword\">public<\/span> ObjectMapper objectMapper() {\n        ObjectMapper objectMapper = <span class=\"hljs-keyword\">new<\/span> ObjectMapper();\n        objectMapper.registerModule(<span class=\"hljs-keyword\">new<\/span> JodaModule());\n        <span class=\"hljs-keyword\">return<\/span> objectMapper;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>Hier wird das Joda-Modul registriert, um die Unterst\u00fctzung f\u00fcr Joda-Time-Datentypen in der Serialisierung und Deserialisierung zu aktivieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Fazit<\/h2>\n\n\n\n<p>Die Konfiguration des ObjectMapper in einer Spring-Anwendung bietet eine Vielzahl von M\u00f6glichkeiten, um das Verhalten der JSON-Konvertierung anzupassen. Die Standardkonfiguration von Spring Boot reicht oft aus, aber in komplexeren Szenarien ist es wichtig, die Konfiguration an die spezifischen Anforderungen anzupassen. Benutzerdefinierte Serializer, Deserializer, Features und Module erm\u00f6glichen eine fein abgestimmte Kontrolle \u00fcber den Prozess und helfen dabei, die Flexibilit\u00e4t und Leistungsf\u00e4higkeit der Anwendung zu optimieren. Durch die Verwendung der <code>@Primary<\/code>-Annotation wird sichergestellt, dass die benutzerdefinierte ObjectMapper-Bean als bevorzugte Instanz verwendet wird.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Jackson-Bibliothek ist ein leistungsf\u00e4higes Werkzeug f\u00fcr die Serialisierung und Deserialisierung von JSON-Daten in Java-Anwendungen. In einer Spring-Anwendung wird die ObjectMapper-Klasse von Jackson oft verwendet, um zwischen JSON und Java-Objekten zu konvertieren. Die Konfiguration dieses ObjectMapper ist entscheidend, um die gew\u00fcnschten Ergebnisse zu erzielen und die Anforderungen der Anwendung zu erf\u00fcllen. In diesem Artikel werden [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-178","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/178","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=178"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions"}],"predecessor-version":[{"id":179,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions\/179"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}