From 382936f2111079dcba927f6c6e77bfa55d9f5be0 Mon Sep 17 00:00:00 2001 From: Sammy Chu Date: Tue, 7 May 2019 16:59:20 +0800 Subject: [PATCH 1/2] #177 Avoid explicitly inject ObjectMapper to the ObjectMapper --- .../graphql/servlet/ConfiguringObjectMapperProvider.java | 4 ---- .../graphql/servlet/internal/VariablesDeserializer.java | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java b/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java index 55f405b5..7fdb2fed 100644 --- a/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java +++ b/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java @@ -23,10 +23,6 @@ public ObjectMapper provide() { SerializationFeature.FAIL_ON_EMPTY_BEANS).registerModule(new Jdk8Module()); objectMapperConfigurer.configure(mapper); - InjectableValues.Std injectableValues = new InjectableValues.Std(); - injectableValues.addValue(ObjectMapper.class, mapper); - mapper.setInjectableValues(injectableValues); - return mapper; } } diff --git a/src/main/java/graphql/servlet/internal/VariablesDeserializer.java b/src/main/java/graphql/servlet/internal/VariablesDeserializer.java index da3f532f..8427d33e 100644 --- a/src/main/java/graphql/servlet/internal/VariablesDeserializer.java +++ b/src/main/java/graphql/servlet/internal/VariablesDeserializer.java @@ -1,10 +1,10 @@ package graphql.servlet.internal; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; @@ -15,17 +15,17 @@ public class VariablesDeserializer extends JsonDeserializer> { @Override public Map deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return deserializeVariablesObject(p.readValueAs(Object.class), (ObjectMapper) ctxt.findInjectableValue(ObjectMapper.class.getName(), null, null)); + return deserializeVariablesObject(p.readValueAs(Object.class), p.getCodec()); } - public static Map deserializeVariablesObject(Object variables, ObjectMapper mapper) { + public static Map deserializeVariablesObject(Object variables, ObjectCodec codec) { if (variables instanceof Map) { @SuppressWarnings("unchecked") Map genericVariables = (Map) variables; return genericVariables; } else if (variables instanceof String) { try { - return mapper.readValue((String) variables, new TypeReference>() {}); + return codec.readValue(codec.getFactory().createParser((String) variables), new TypeReference>() {}); } catch (IOException e) { throw new RuntimeException(e); } From d89150703f1fdc80083a0fee5b2fc86125d135d8 Mon Sep 17 00:00:00 2001 From: Sammy Chu Date: Tue, 7 May 2019 18:19:12 +0800 Subject: [PATCH 2/2] #179 Provide ability to plug in pre-configured ObjectMapper --- .../ConfiguringObjectMapperProvider.java | 24 ++++++++++++------- .../DefaultObjectMapperConfigurer.java | 9 ++++++- .../graphql/servlet/GraphQLObjectMapper.java | 4 +--- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java b/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java index 7fdb2fed..138932d4 100644 --- a/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java +++ b/src/main/java/graphql/servlet/ConfiguringObjectMapperProvider.java @@ -1,28 +1,34 @@ package graphql.servlet; -import com.fasterxml.jackson.databind.InjectableValues; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; public class ConfiguringObjectMapperProvider implements ObjectMapperProvider { + private final ObjectMapper objectMapperTemplate; + private final ObjectMapperConfigurer objectMapperConfigurer; + public ConfiguringObjectMapperProvider(ObjectMapper objectMapperTemplate, ObjectMapperConfigurer objectMapperConfigurer) { + this.objectMapperTemplate = objectMapperTemplate == null ? new ObjectMapper() : objectMapperTemplate; + this.objectMapperConfigurer = objectMapperConfigurer == null ? new DefaultObjectMapperConfigurer() : objectMapperConfigurer; + } + + public ConfiguringObjectMapperProvider(ObjectMapper objectMapperTemplate) { + this(objectMapperTemplate, null); + } + public ConfiguringObjectMapperProvider(ObjectMapperConfigurer objectMapperConfigurer) { - this.objectMapperConfigurer = objectMapperConfigurer; + this(null, objectMapperConfigurer); } public ConfiguringObjectMapperProvider() { - this.objectMapperConfigurer = new DefaultObjectMapperConfigurer(); + this(null, null); } @Override public ObjectMapper provide() { - ObjectMapper mapper = new ObjectMapper().disable( - SerializationFeature.FAIL_ON_EMPTY_BEANS).registerModule(new Jdk8Module()); - objectMapperConfigurer.configure(mapper); - + ObjectMapper mapper = this.objectMapperTemplate.copy(); + this.objectMapperConfigurer.configure(mapper); return mapper; } } diff --git a/src/main/java/graphql/servlet/DefaultObjectMapperConfigurer.java b/src/main/java/graphql/servlet/DefaultObjectMapperConfigurer.java index e1e8fc21..ede0c71c 100644 --- a/src/main/java/graphql/servlet/DefaultObjectMapperConfigurer.java +++ b/src/main/java/graphql/servlet/DefaultObjectMapperConfigurer.java @@ -1,13 +1,20 @@ package graphql.servlet; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; /** * @author Andrew Potter */ public class DefaultObjectMapperConfigurer implements ObjectMapperConfigurer { + @Override public void configure(ObjectMapper mapper) { - + // default configuration for GraphQL Java Servlet + mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + mapper.registerModule(new Jdk8Module()); + mapper.setDefaultPropertyInclusion(JsonInclude.Include.ALWAYS); } } diff --git a/src/main/java/graphql/servlet/GraphQLObjectMapper.java b/src/main/java/graphql/servlet/GraphQLObjectMapper.java index 78f5839a..6a2d86c6 100644 --- a/src/main/java/graphql/servlet/GraphQLObjectMapper.java +++ b/src/main/java/graphql/servlet/GraphQLObjectMapper.java @@ -1,6 +1,5 @@ package graphql.servlet; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.MappingIterator; @@ -45,8 +44,7 @@ public ObjectMapper getJacksonMapper() { synchronized(this) { result = mapper; if (result == null) { // Second check (with locking) - mapper = result = objectMapperProvider.provide().copy(); - mapper.setDefaultPropertyInclusion(JsonInclude.Include.ALWAYS); + mapper = result = objectMapperProvider.provide(); } } }