This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/master by this push:
new 8da4588df3 CAUSEWAY-3748: [Commons] Json/YamlUtils support for Optional
8da4588df3 is described below
commit 8da4588df3533401619e8cb2446258260e4ee45a
Author: Andi Huber <[email protected]>
AuthorDate: Mon May 27 17:41:04 2024 +0200
CAUSEWAY-3748: [Commons] Json/YamlUtils support for Optional
---
commons/pom.xml | 4 ++++
commons/src/main/java/module-info.java | 1 +
.../main/java/org/apache/causeway/commons/io/JsonUtils.java | 13 +++++++++++++
.../main/java/org/apache/causeway/commons/io/YamlUtils.java | 2 ++
.../java/org/apache/causeway/commons/io/JsonUtilsTest.java | 12 ++++++++----
.../JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt | 4 ++++
.../java/org/apache/causeway/commons/io/YamlUtilsTest.java | 5 ++++-
.../commons/io/YamlUtilsTest.toStringUtf8.approved.txt | 3 +++
.../java/org/apache/causeway/commons/io/_TestDomain.java | 12 +++++++++++-
9 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/commons/pom.xml b/commons/pom.xml
index bcf40b9495..8f1f6d3437 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -133,6 +133,10 @@
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.datatype</groupId>
+ <artifactId>jackson-datatype-jdk8</artifactId>
+ </dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
diff --git a/commons/src/main/java/module-info.java
b/commons/src/main/java/module-info.java
index e2a7a0fff7..4d09aa72aa 100644
--- a/commons/src/main/java/module-info.java
+++ b/commons/src/main/java/module-info.java
@@ -78,6 +78,7 @@ module org.apache.causeway.commons {
requires com.sun.xml.bind;
requires com.fasterxml.jackson.datatype.jsr310;
requires com.fasterxml.jackson.dataformat.yaml;
+ requires com.fasterxml.jackson.datatype.jdk8;
opens org.apache.causeway.commons.internal.resources to java.xml.bind,
com.sun.xml.bind; // JUnit test
opens org.apache.causeway.commons.io to java.xml.bind, com.sun.xml.bind;
diff --git
a/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
b/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
index fa96958803..59b12ee070 100644
--- a/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
@@ -42,6 +42,7 @@ import
com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
@@ -52,6 +53,11 @@ import org.apache.causeway.commons.functional.Try;
import org.apache.causeway.commons.internal.base._Casts;
import org.apache.causeway.commons.internal.exceptions._Exceptions;
import org.apache.causeway.commons.internal.reflection._Generics;
+import org.apache.causeway.commons.io.JsonUtils.CanDeserializer;
+import org.apache.causeway.commons.io.JsonUtils.CanSerializer;
+import org.apache.causeway.commons.io.JsonUtils.JacksonCustomizer;
+import org.apache.causeway.commons.io.JsonUtils.XDeserializer;
+import org.apache.causeway.commons.io.JsonUtils.XSerializer;
import lombok.NonNull;
import lombok.SneakyThrows;
@@ -171,6 +177,11 @@ public class JsonUtils {
return mapper.setSerializationInclusion(Include.NON_NULL);
}
+ /** add support for JDK 8, e.g. {@link Optional} */
+ public ObjectMapper jdk8Support(final ObjectMapper mapper) {
+ return mapper.registerModule(new Jdk8Module());
+ }
+
/** add support for JAXB annotations */
public ObjectMapper jaxbAnnotationSupport(final ObjectMapper mapper) {
return mapper.registerModule(new JaxbAnnotationModule());
@@ -283,6 +294,7 @@ public class JsonUtils {
private ObjectMapper createJacksonReader(
final JsonUtils.JacksonCustomizer ... customizers) {
var mapper = new ObjectMapper();
+ mapper = jdk8Support(mapper);
mapper = readingJavaTimeSupport(mapper);
mapper = readingCanSupport(mapper);
for(JsonUtils.JacksonCustomizer customizer : customizers) {
@@ -295,6 +307,7 @@ public class JsonUtils {
private ObjectMapper createJacksonWriter(
final JsonUtils.JacksonCustomizer ... customizers) {
var mapper = new ObjectMapper();
+ mapper = jdk8Support(mapper);
mapper = writingJavaTimeSupport(mapper);
mapper = writingCanSupport(mapper);
for(JsonUtils.JacksonCustomizer customizer : customizers) {
diff --git
a/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
b/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
index f1976d5d7f..9e7d3a7982 100644
--- a/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
@@ -116,6 +116,7 @@ public class YamlUtils {
private ObjectMapper createJacksonReader(
final JsonUtils.JacksonCustomizer ... customizers) {
var mapper = new ObjectMapper(new YAMLFactory());
+ mapper = JsonUtils.jdk8Support(mapper);
mapper = JsonUtils.readingJavaTimeSupport(mapper);
mapper = JsonUtils.readingCanSupport(mapper);
for(JsonUtils.JacksonCustomizer customizer : customizers) {
@@ -132,6 +133,7 @@ public class YamlUtils {
final JsonUtils.JacksonCustomizer ... customizers) {
var mapper = new ObjectMapper(new YAMLFactory()
.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));
+ mapper = JsonUtils.jdk8Support(mapper);
mapper = JsonUtils.writingJavaTimeSupport(mapper);
mapper = JsonUtils.writingCanSupport(mapper);
for(JsonUtils.JacksonCustomizer customizer : customizers) {
diff --git
a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
index f012c7312a..ecf1b38b9b 100644
--- a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
+++ b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
@@ -31,16 +31,16 @@ import lombok.val;
class JsonUtilsTest {
/*
- * [ERROR] Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:3.11.0:testCompile
+ * [ERROR] Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:3.11.0:testCompile
* on project causeway-commons: Compilation failure:
* [ERROR] package com.google.gson does not exist
* [ERROR] cannot find symbol
* [ERROR] symbol: class GsonBuilder
- * [ERROR] location: class org.approvaltests.JsonApprovals
+ * [ERROR] location: class org.approvaltests.JsonApprovals
*/
org.approvaltests.JsonApprovals dummy1; // references
com.google.gson.GsonBuilder
com.google.gson.GsonBuilder dummy2; // Requires
(GSON)[https://mvnrepository.com/artifact/com.google.code.gson/gson]
-
+
private Person person;
@BeforeEach
@@ -77,7 +77,11 @@ class JsonUtilsTest {
+ " }, {\r\n"
+ " \"zip\" : 34,\r\n"
+ " \"street\" : \"bluestreet\"\r\n"
- + " } ]\r\n"
+ + " } ],\r\n"
+ + " \"phone\" : {\r\n"
+ + " \"home\" : \"+99 1234\",\r\n"
+ + " \"work\" : null\r\n"
+ + " }"
+ " }";
var json = person.getJava8Time().interpolator().applyTo(jsonTemplate);
diff --git
a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
index 4514ff5d4a..520b4bcd0d 100644
---
a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
+++
b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
@@ -18,5 +18,9 @@
"offsetTime" : "17:33:45-02:00",
"offsetDateTime" : "2007-11-21T17:33:45-02:00",
"zonedDateTime" : "2007-11-21T17:33:45+01:00"
+ },
+ "phone" : {
+ "home" : "+99 1234",
+ "work" : null
}
}
\ No newline at end of file
diff --git
a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
index 458d7ca0bd..0ea013848d 100644
--- a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
+++ b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
@@ -59,7 +59,10 @@ class YamlUtilsTest {
+ " localDateTime: ${localDateTime}\r\n"
+ " offsetTime: ${offsetTime}\r\n"
+ " offsetDateTime: ${offsetDateTime}\r\n"
- + " zonedDateTime: ${zonedDateTime}\r\n";
+ + " zonedDateTime: ${zonedDateTime}\r\n"
+ + "phone:\r\n"
+ + " home: \"+99 1234\"\r\n"
+ + " work: null";
var yaml = person.getJava8Time().interpolator().applyTo(yamlTemplate);
diff --git
a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
index db6037f6be..813ed62c0e 100644
---
a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
+++
b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
@@ -14,3 +14,6 @@ java8Time:
offsetTime: "17:33:45-02:00"
offsetDateTime: "2007-11-21T17:33:45-02:00"
zonedDateTime: "2007-11-21T17:33:45+01:00"
+phone:
+ home: "+99 1234"
+ work: null
diff --git
a/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
b/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
index 84e71caf7e..25a72857ab 100644
--- a/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
+++ b/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
@@ -29,6 +29,7 @@ import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.internal.base._StringInterpolation;
@@ -47,6 +48,7 @@ class _TestDomain {
Address address;
Can<Address> additionalAddresses;
Java8Time java8Time;
+ Phone phone;
}
@Data @AllArgsConstructor @NoArgsConstructor
@@ -55,6 +57,12 @@ class _TestDomain {
String street;
}
+ @Data @AllArgsConstructor @NoArgsConstructor
+ public static class Phone {
+ Optional<String> home;
+ Optional<String> work;
+ }
+
@Data @AllArgsConstructor @NoArgsConstructor
public static class Java8Time {
LocalTime localTime;
@@ -112,6 +120,8 @@ class _TestDomain {
OffsetTime.of(LocalTime.of(17, 33, 45),
ZoneOffset.ofHours(-2)),
OffsetDateTime.of(LocalDateTime.of(2007, 11, 21, 17,
33, 45), ZoneOffset.ofHours(-2)),
ZonedDateTime.of(LocalDateTime.of(2007, 11, 21, 17,
33, 45), ZoneId.of("Europe/Vienna"))
- ));
+ ),
+ new Phone(Optional.of("+99 1234"), Optional.empty())
+ );
}
}