Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit e7d185d

Browse files
authored
Merge pull request #115 from mxab/wip/unify-objectmapper
Create single ObjectMapper based provider beans
2 parents ebf3bd6 + e287bd1 commit e7d185d

File tree

3 files changed

+71
-8
lines changed

3 files changed

+71
-8
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ LIB_JUNIT_VER = 4.12
4141
LIB_SPRING_CORE_VER = 5.0.4.RELEASE
4242
LIB_SPRING_BOOT_VER = 2.0.4.RELEASE
4343
LIB_GRAPHQL_SERVLET_VER = 6.1.3-SNAPSHOT
44-
LIB_GRAPHQL_JAVA_TOOLS_VER = 5.2.3
44+
LIB_GRAPHQL_JAVA_TOOLS_VER = 5.2.4-SNAPSHOT
4545
LIB_COMMONS_IO_VER = 2.6
4646

4747
GRADLE_WRAPPER_VER = 4.7

graphql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphql/boot/GraphQLJavaToolsAutoConfiguration.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
package com.oembedler.moon.graphql.boot;
22

33
import com.coxautodev.graphql.tools.*;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
6+
import com.fasterxml.jackson.module.kotlin.KotlinModule;
7+
import graphql.language.FieldDefinition;
48
import graphql.schema.GraphQLScalarType;
59
import graphql.schema.GraphQLSchema;
610
import graphql.servlet.GraphQLSchemaProvider;
711
import org.springframework.beans.factory.annotation.Autowired;
812
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
913
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1014
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
15+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1116
import org.springframework.context.annotation.Bean;
1217
import org.springframework.context.annotation.Configuration;
1318

1419
import java.io.IOException;
1520
import java.util.List;
21+
import java.util.Optional;
22+
23+
import static com.coxautodev.graphql.tools.SchemaParserOptions.newOptions;
1624

1725
/**
1826
* @author Andrew Potter
@@ -39,7 +47,11 @@ public SchemaStringProvider schemaStringProvider() {
3947
@Bean
4048
@ConditionalOnBean({GraphQLResolver.class})
4149
@ConditionalOnMissingBean
42-
public SchemaParser schemaParser(List<GraphQLResolver<?>> resolvers, SchemaStringProvider schemaStringProvider) throws IOException {
50+
public SchemaParser schemaParser(
51+
List<GraphQLResolver<?>> resolvers,
52+
SchemaStringProvider schemaStringProvider,
53+
Optional<PerFieldObjectMapperProvider> perFieldObjectMapperProvider
54+
) throws IOException {
4355
SchemaParserBuilder builder = dictionary != null ? new SchemaParserBuilder(dictionary) : new SchemaParserBuilder();
4456

4557
List<String> schemaStrings = schemaStringProvider.schemaStrings();
@@ -51,12 +63,26 @@ public SchemaParser schemaParser(List<GraphQLResolver<?>> resolvers, SchemaStrin
5163

5264
if (options != null) {
5365
builder.options(options);
66+
}else if(perFieldObjectMapperProvider.isPresent()) {
67+
final SchemaParserOptions.Builder optionsBuilder =
68+
newOptions().objectMapperProvider(perFieldObjectMapperProvider.get());
69+
builder.options(optionsBuilder.build());
5470
}
5571

5672
return builder.resolvers(resolvers)
5773
.build();
5874
}
5975

76+
@Bean
77+
@ConditionalOnMissingBean
78+
@ConditionalOnProperty(value="graphql.tools.use-default-objectmapper", havingValue = "true", matchIfMissing = true)
79+
public PerFieldObjectMapperProvider perFieldObjectMapperProvider(ObjectMapper objectMapper) {
80+
objectMapper
81+
.registerModule(new Jdk8Module())
82+
.registerModule(new KotlinModule());
83+
return fieldDefinition -> objectMapper;
84+
}
85+
6086

6187
@Bean
6288
@ConditionalOnBean(SchemaParser.class)

graphql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphql/boot/GraphQLWebAutoConfiguration.java

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,38 @@
1919

2020
package com.oembedler.moon.graphql.boot;
2121

22+
import com.coxautodev.graphql.tools.PerFieldObjectMapperProvider;
23+
import com.fasterxml.jackson.databind.InjectableValues;
24+
import com.fasterxml.jackson.databind.ObjectMapper;
2225
import graphql.execution.AsyncExecutionStrategy;
2326
import graphql.execution.ExecutionStrategy;
2427
import graphql.execution.SubscriptionExecutionStrategy;
2528
import graphql.execution.instrumentation.ChainedInstrumentation;
2629
import graphql.execution.instrumentation.Instrumentation;
2730
import graphql.execution.preparsed.PreparsedDocumentProvider;
2831
import graphql.schema.GraphQLSchema;
29-
import graphql.servlet.*;
32+
import graphql.servlet.AbstractGraphQLHttpServlet;
33+
import graphql.servlet.DefaultExecutionStrategyProvider;
34+
import graphql.servlet.DefaultGraphQLSchemaProvider;
35+
import graphql.servlet.ExecutionStrategyProvider;
36+
import graphql.servlet.GraphQLContextBuilder;
37+
import graphql.servlet.GraphQLErrorHandler;
38+
import graphql.servlet.GraphQLInvocationInputFactory;
39+
import graphql.servlet.GraphQLObjectMapper;
40+
import graphql.servlet.GraphQLQueryInvoker;
41+
import graphql.servlet.GraphQLRootObjectBuilder;
42+
import graphql.servlet.GraphQLSchemaProvider;
43+
import graphql.servlet.GraphQLServletListener;
44+
import graphql.servlet.ObjectMapperConfigurer;
45+
import graphql.servlet.ObjectMapperProvider;
46+
import graphql.servlet.SimpleGraphQLHttpServlet;
3047
import org.springframework.beans.factory.annotation.Autowired;
31-
import org.springframework.beans.factory.annotation.Value;
3248
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
33-
import org.springframework.boot.autoconfigure.condition.*;
49+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
50+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
51+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
52+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
53+
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
3454
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3555
import org.springframework.boot.web.servlet.ServletRegistrationBean;
3656
import org.springframework.context.annotation.Bean;
@@ -45,6 +65,8 @@
4565
import java.util.Map;
4666
import java.util.Optional;
4767

68+
import static graphql.servlet.GraphQLObjectMapper.newBuilder;
69+
4870

4971
/**
5072
* @author <a href="mailto:java.lang.RuntimeException@gmail.com">oEmbedler Inc.</a>
@@ -182,20 +204,35 @@ public GraphQLQueryInvoker queryInvoker(ExecutionStrategyProvider executionStrat
182204

183205
@Bean
184206
@ConditionalOnMissingBean
185-
public GraphQLObjectMapper graphQLObjectMapper() {
186-
GraphQLObjectMapper.Builder builder = GraphQLObjectMapper.newBuilder();
207+
public GraphQLObjectMapper graphQLObjectMapper(Optional<ObjectMapperProvider> objectMapperProvider) {
208+
GraphQLObjectMapper.Builder builder = newBuilder();
187209

188210
if (errorHandler != null) {
189211
builder.withGraphQLErrorHandler(errorHandler);
190212
}
191213

192-
if (objectMapperConfigurer != null) {
214+
if (objectMapperProvider.isPresent()){
215+
builder.withObjectMapperProvider(objectMapperProvider.get());
216+
} else if (objectMapperConfigurer != null) {
193217
builder.withObjectMapperConfigurer(objectMapperConfigurer);
194218
}
195219

196220
return builder.build();
197221
}
198222

223+
@Bean
224+
@ConditionalOnMissingBean
225+
@ConditionalOnProperty(value="graphql.servlet.use-default-objectmapper", havingValue = "true",
226+
matchIfMissing = true)
227+
public ObjectMapperProvider objectMapperProvider(ObjectMapper objectMapper) {
228+
229+
InjectableValues.Std injectableValues = new InjectableValues.Std();
230+
injectableValues.addValue(ObjectMapper.class, objectMapper);
231+
objectMapper.setInjectableValues(injectableValues);
232+
return () -> objectMapper;
233+
}
234+
235+
199236

200237
@Bean
201238
@ConditionalOnMissingBean

0 commit comments

Comments
 (0)