Skip to content

Commit 0632811

Browse files
committed
Use Jdk8Module to serialize Optional values
1 parent 024dde3 commit 0632811

6 files changed

Lines changed: 43 additions & 1 deletion

File tree

pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@
8686
<artifactId>jackson-dataformat-yaml</artifactId>
8787
<version>2.14.0</version>
8888
</dependency>
89+
<dependency>
90+
<groupId>com.fasterxml.jackson.datatype</groupId>
91+
<artifactId>jackson-datatype-jdk8</artifactId>
92+
<version>2.14.0</version>
93+
</dependency>
8994
</dependencies>
9095
</dependencyManagement>
9196

@@ -150,6 +155,10 @@
150155
<groupId>com.fasterxml.jackson.dataformat</groupId>
151156
<artifactId>jackson-dataformat-yaml</artifactId>
152157
</dependency>
158+
<dependency>
159+
<groupId>com.fasterxml.jackson.datatype</groupId>
160+
<artifactId>jackson-datatype-jdk8</artifactId>
161+
</dependency>
153162
<dependency>
154163
<groupId>ch.obermuhlner</groupId>
155164
<artifactId>big-math</artifactId>

src/main/java/com/hubspot/jinjava/JinjavaConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.fasterxml.jackson.databind.ObjectMapper;
2121
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
22+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
2223
import com.google.common.collect.ImmutableSet;
2324
import com.hubspot.jinjava.el.JinjavaInterpreterResolver;
2425
import com.hubspot.jinjava.el.JinjavaObjectUnwrapper;
@@ -158,7 +159,7 @@ private JinjavaConfig(Builder builder) {
158159

159160
private ObjectMapper setupObjectMapper(@Nullable ObjectMapper objectMapper) {
160161
if (objectMapper == null) {
161-
objectMapper = new ObjectMapper();
162+
objectMapper = new ObjectMapper().registerModule(new Jdk8Module());
162163
if (legacyOverrides.isUseSnakeCasePropertyNaming()) {
163164
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
164165
}

src/main/java/com/hubspot/jinjava/objects/serialization/PyishObjectMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
1010
import com.fasterxml.jackson.databind.SerializerProvider;
1111
import com.fasterxml.jackson.databind.module.SimpleModule;
12+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
1213
import com.google.common.annotations.Beta;
1314
import com.hubspot.jinjava.interpret.DeferredValueException;
1415
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
@@ -45,6 +46,7 @@ private static ObjectMapper getPyishObjectMapper() {
4546
ObjectMapper mapper = new ObjectMapper(
4647
new JsonFactoryBuilder().quoteChar('\'').build()
4748
)
49+
.registerModule(new Jdk8Module())
4850
.registerModule(
4951
new SimpleModule()
5052
.setSerializerModifier(PyishBeanSerializerModifier.INSTANCE)

src/main/java/com/hubspot/jinjava/objects/serialization/PyishSerializable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.databind.ObjectMapper;
77
import com.fasterxml.jackson.databind.ObjectWriter;
88
import com.fasterxml.jackson.databind.SerializerProvider;
9+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
910
import com.google.common.annotations.Beta;
1011
import com.hubspot.jinjava.interpret.DeferredValueException;
1112
import com.hubspot.jinjava.objects.PyWrapper;
@@ -19,6 +20,7 @@ public interface PyishSerializable extends PyWrapper {
1920
ObjectWriter SELF_WRITER = new ObjectMapper(
2021
new JsonFactoryBuilder().quoteChar('\'').build()
2122
)
23+
.registerModule(new Jdk8Module())
2224
.writer(PyishPrettyPrinter.INSTANCE)
2325
.with(PyishCharacterEscapes.INSTANCE);
2426

src/test/java/com/hubspot/jinjava/objects/serialization/PyishObjectMapperTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.HashMap;
1717
import java.util.List;
1818
import java.util.Map;
19+
import java.util.Optional;
1920
import org.apache.commons.lang3.RandomStringUtils;
2021
import org.junit.Test;
2122

@@ -168,6 +169,11 @@ public void itSerializesToSnakeCaseWhenLegacyOverrideIsSet() {
168169
}
169170
}
170171

172+
@Test
173+
public void itSerializesOptional() {
174+
assertThat(PyishObjectMapper.getAsPyishString(Optional.of("foo"))).isEqualTo("'foo'");
175+
}
176+
171177
static class Foo {
172178

173179
private final String bar;

src/test/java/com/hubspot/jinjava/util/EagerExpressionResolverTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.LinkedHashMap;
3636
import java.util.List;
3737
import java.util.Map;
38+
import java.util.Optional;
3839
import java.util.concurrent.CompletableFuture;
3940
import java.util.concurrent.atomic.AtomicLong;
4041
import org.junit.After;
@@ -93,6 +94,15 @@ private JinjavaInterpreter getInterpreter(boolean evaluateMapKeys) throws Except
9394
this.getClass().getDeclaredMethod("sleeper")
9495
)
9596
);
97+
jinjava
98+
.getGlobalContext()
99+
.registerFunction(
100+
new ELFunctionDefinition(
101+
"",
102+
"optionally",
103+
this.getClass().getDeclaredMethod("optionally", boolean.class)
104+
)
105+
);
96106
interpreter = new JinjavaInterpreter(jinjava.newInterpreter());
97107
context = interpreter.getContext();
98108
context.put("deferred", DeferredValue.instance());
@@ -124,6 +134,14 @@ public void itResolvesDeferredBoolean() {
124134
assertThat(interpreter.resolveELExpression(partiallyResolved, 1)).isEqualTo(true);
125135
}
126136

137+
@Test
138+
public void itSerializesNestedOptional() {
139+
assertThat(eagerResolveExpression("[optionally(true)]").toString())
140+
.isEqualTo("['1']");
141+
assertThat(eagerResolveExpression("[optionally(false)]").toString())
142+
.isEqualTo("[null]");
143+
}
144+
127145
@Test
128146
public void itResolvesDeferredList() {
129147
context.put("foo", "foo_val");
@@ -877,6 +895,10 @@ public static long sleeper() throws InterruptedException {
877895
return sleepTime;
878896
}
879897

898+
public static Optional<String> optionally(boolean hasValue) {
899+
return Optional.of(hasValue).filter(Boolean::booleanValue).map(ignored -> "1");
900+
}
901+
880902
private static class Foo {
881903

882904
private final String bar;

0 commit comments

Comments
 (0)