From b3d5d31bfd9255b09d11713200bca27e602caf64 Mon Sep 17 00:00:00 2001 From: Marten Deinum Date: Mon, 14 Dec 2020 10:51:00 +0100 Subject: [PATCH] Provide constructors for injection Currently when reading/writing JSON and using the reader/marshaller provided and you want a custom Gson or ObjectMapper instance it still creates the not needed instance. Move the construction to a constructor and provide a constructor to directly pass in the pre-configured Gson or ObjectMapper instance. The same approach is used in Spring itself where Gson or ObjectMapper instances can be passed in. --- .../json/GsonJsonFileItemWriterFunctionalTests.java | 4 +--- .../JacksonJsonFileItemWriterFunctionalTests.java | 4 +--- .../batch/item/json/GsonJsonObjectMarshaller.java | 9 +++++++++ .../batch/item/json/GsonJsonObjectReader.java | 11 +++++++++-- .../batch/item/json/JacksonJsonObjectMarshaller.java | 11 ++++++++++- .../batch/item/json/JacksonJsonObjectReader.java | 11 +++++++++-- 6 files changed, 39 insertions(+), 11 deletions(-) diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/GsonJsonFileItemWriterFunctionalTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/GsonJsonFileItemWriterFunctionalTests.java index bcd6b4e7a..463c51b3c 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/GsonJsonFileItemWriterFunctionalTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/GsonJsonFileItemWriterFunctionalTests.java @@ -34,9 +34,7 @@ public class GsonJsonFileItemWriterFunctionalTests extends JsonFileItemWriterFun @Override protected JsonObjectMarshaller getJsonObjectMarshallerWithPrettyPrint() { Gson gson = new GsonBuilder().setPrettyPrinting().create(); - GsonJsonObjectMarshaller jsonObjectMarshaller = new GsonJsonObjectMarshaller<>(); - jsonObjectMarshaller.setGson(gson); - return jsonObjectMarshaller; + return new GsonJsonObjectMarshaller<>(gson); } @Override diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/JacksonJsonFileItemWriterFunctionalTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/JacksonJsonFileItemWriterFunctionalTests.java index d800bc04a..971e00683 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/JacksonJsonFileItemWriterFunctionalTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/item/json/JacksonJsonFileItemWriterFunctionalTests.java @@ -35,9 +35,7 @@ public class JacksonJsonFileItemWriterFunctionalTests extends JsonFileItemWriter protected JsonObjectMarshaller getJsonObjectMarshallerWithPrettyPrint() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); - JacksonJsonObjectMarshaller jsonObjectMarshaller = new JacksonJsonObjectMarshaller<>(); - jsonObjectMarshaller.setObjectMapper(objectMapper); - return jsonObjectMarshaller; + return new JacksonJsonObjectMarshaller<>(objectMapper); } @Override diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectMarshaller.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectMarshaller.java index 443075b68..501afe138 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectMarshaller.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectMarshaller.java @@ -30,9 +30,18 @@ public class GsonJsonObjectMarshaller implements JsonObjectMarshaller { private Gson gson = new Gson(); + public GsonJsonObjectMarshaller() { + this.gson=new Gson(); + } + + public GsonJsonObjectMarshaller(Gson gson) { + this.gson=gson; + } + /** * Set the {@link Gson} object to use. * @param gson object to use + * @see #GsonJsonObjectMarshaller(Gson) */ public void setGson(Gson gson) { this.gson = gson; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectReader.java index 44f2c4e0b..128121e16 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/GsonJsonObjectReader.java @@ -42,11 +42,11 @@ import org.springframework.util.Assert; */ public class GsonJsonObjectReader implements JsonObjectReader { - private Class itemType; + private final Class itemType; private JsonReader jsonReader; - private Gson mapper = new Gson(); + private Gson mapper; private InputStream inputStream; @@ -55,12 +55,19 @@ public class GsonJsonObjectReader implements JsonObjectReader { * @param itemType the target item type */ public GsonJsonObjectReader(Class itemType) { + this.mapper = new Gson(); + this.itemType = itemType; + } + + public GsonJsonObjectReader(Gson mapper, Class itemType) { + this.mapper = mapper; this.itemType = itemType; } /** * Set the object mapper to use to map Json objects to domain objects. * @param mapper the object mapper to use + * @see #GsonJsonObjectReader(Gson, Class) */ public void setMapper(Gson mapper) { Assert.notNull(mapper, "The mapper must not be null"); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectMarshaller.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectMarshaller.java index 5e4b9159b..535bd4e7f 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectMarshaller.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectMarshaller.java @@ -31,11 +31,20 @@ import org.springframework.batch.item.ItemStreamException; */ public class JacksonJsonObjectMarshaller implements JsonObjectMarshaller { - private ObjectMapper objectMapper = new ObjectMapper(); + private ObjectMapper objectMapper; + + public JacksonJsonObjectMarshaller() { + this.objectMapper = new ObjectMapper(); + } + + public JacksonJsonObjectMarshaller(ObjectMapper objectMapper) { + this.objectMapper=objectMapper; + } /** * Set the {@link ObjectMapper} to use. * @param objectMapper to use + * @see #JacksonJsonObjectMarshaller(ObjectMapper) */ public void setObjectMapper(ObjectMapper objectMapper) { this.objectMapper = objectMapper; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectReader.java index 18e853e8d..bffbf5da2 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/json/JacksonJsonObjectReader.java @@ -39,11 +39,11 @@ import org.springframework.util.Assert; */ public class JacksonJsonObjectReader implements JsonObjectReader { - private Class itemType; + private final Class itemType; private JsonParser jsonParser; - private ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper; private InputStream inputStream; @@ -52,12 +52,19 @@ public class JacksonJsonObjectReader implements JsonObjectReader { * @param itemType the target item type */ public JacksonJsonObjectReader(Class itemType) { + this.mapper=new ObjectMapper(); this.itemType = itemType; } + public JacksonJsonObjectReader(ObjectMapper mapper, Class itemType) { + this.mapper= mapper; + this.itemType=itemType; + } + /** * Set the object mapper to use to map Json objects to domain objects. * @param mapper the object mapper to use + * @see #JacksonJsonObjectReader(ObjectMapper, Class) */ public void setMapper(ObjectMapper mapper) { Assert.notNull(mapper, "The mapper must not be null");