Skip to content

Commit f627eea

Browse files
committed
refactor: Allow GsonJsonMapper to accept a Gson instance
1 parent e3059ee commit f627eea

2 files changed

Lines changed: 46 additions & 12 deletions

File tree

src/main/java/com/retailsvc/http/internal/gson/GsonJsonMapper.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.LinkedHashMap;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.Objects;
2829
import java.util.function.Function;
2930

3031
/**
@@ -47,18 +48,30 @@ public final class GsonJsonMapper implements TypedTypeMapper {
4748
private final Gson gson;
4849

4950
public GsonJsonMapper() {
50-
this.gson =
51-
new GsonBuilder()
52-
.registerTypeAdapter(Instant.class, iso(Instant::toString, Instant::parse))
53-
.registerTypeAdapter(
54-
OffsetDateTime.class, iso(OffsetDateTime::toString, OffsetDateTime::parse))
55-
.registerTypeAdapter(
56-
ZonedDateTime.class, iso(ZonedDateTime::toString, ZonedDateTime::parse))
57-
.registerTypeAdapter(
58-
LocalDateTime.class, iso(LocalDateTime::toString, LocalDateTime::parse))
59-
.registerTypeAdapter(LocalDate.class, iso(LocalDate::toString, LocalDate::parse))
60-
.registerTypeAdapter(LocalTime.class, iso(LocalTime::toString, LocalTime::parse))
61-
.create();
51+
this(defaultGson());
52+
}
53+
54+
public GsonJsonMapper(Gson gson) {
55+
this.gson = Objects.requireNonNull(gson, "gson must not be null");
56+
}
57+
58+
/** Returns the wrapped {@link Gson} instance. */
59+
public Gson gson() {
60+
return gson;
61+
}
62+
63+
private static Gson defaultGson() {
64+
return new GsonBuilder()
65+
.registerTypeAdapter(Instant.class, iso(Instant::toString, Instant::parse))
66+
.registerTypeAdapter(
67+
OffsetDateTime.class, iso(OffsetDateTime::toString, OffsetDateTime::parse))
68+
.registerTypeAdapter(
69+
ZonedDateTime.class, iso(ZonedDateTime::toString, ZonedDateTime::parse))
70+
.registerTypeAdapter(
71+
LocalDateTime.class, iso(LocalDateTime::toString, LocalDateTime::parse))
72+
.registerTypeAdapter(LocalDate.class, iso(LocalDate::toString, LocalDate::parse))
73+
.registerTypeAdapter(LocalTime.class, iso(LocalTime::toString, LocalTime::parse))
74+
.create();
6275
}
6376

6477
@Override

src/test/java/com/retailsvc/http/internal/gson/GsonJsonMapperTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5+
import com.google.gson.Gson;
6+
import com.google.gson.GsonBuilder;
57
import java.nio.charset.StandardCharsets;
68
import java.time.Instant;
79
import java.time.LocalDate;
@@ -10,6 +12,7 @@
1012
import java.time.OffsetDateTime;
1113
import java.time.ZoneOffset;
1214
import java.time.ZonedDateTime;
15+
import java.util.Collections;
1316
import java.util.List;
1417
import java.util.Map;
1518
import org.junit.jupiter.api.Test;
@@ -118,6 +121,24 @@ void readAsRoundTripsJsr310Fields() {
118121
assertThat(value.day).isEqualTo(LocalDate.of(2026, 5, 13));
119122
}
120123

124+
@Test
125+
void constructorWithGsonUsesSuppliedInstance() {
126+
Gson custom = new GsonBuilder().serializeNulls().create();
127+
GsonJsonMapper m = new GsonJsonMapper(custom);
128+
129+
byte[] out = m.writeTo(Collections.singletonMap("k", null));
130+
131+
assertThat(new String(out, StandardCharsets.UTF_8)).isEqualTo("{\"k\":null}");
132+
}
133+
134+
@Test
135+
void gsonAccessorReturnsWrappedInstance() {
136+
Gson custom = new GsonBuilder().serializeNulls().create();
137+
GsonJsonMapper m = new GsonJsonMapper(custom);
138+
139+
assertThat(m.gson()).isSameAs(custom);
140+
}
141+
121142
static final class Item {
122143
String id;
123144
int qty;

0 commit comments

Comments
 (0)