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

Commit 5e6efef

Browse files
committed
Merge remote-tracking branch 'origin/master'
# Conflicts: # graphiql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphiql/boot/GraphiQLController.java
2 parents 66d842b + 65367f8 commit 5e6efef

File tree

6 files changed

+99
-32
lines changed

6 files changed

+99
-32
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,11 @@ Available Spring Boot configuration parameters (either `application.yml` or `app
106106
```yaml
107107
graphiql:
108108
mapping: /graphiql
109-
endpoint: /graphql
109+
endpoint:
110+
graphql: /graphql
111+
subscriptions: /subscriptions
112+
static:
113+
basePath: /
110114
enabled: true
111115
pageTitle: GraphiQL
112116
cdn:

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ LIB_GRAPHQL_JAVA_VER = 9.2
4040
LIB_JUNIT_VER = 4.12
4141
LIB_SPRING_CORE_VER = 5.0.4.RELEASE
4242
LIB_SPRING_BOOT_VER = 2.0.4.RELEASE
43-
LIB_GRAPHQL_SERVLET_VER = 6.1.3-SNAPSHOT
44-
LIB_GRAPHQL_JAVA_TOOLS_VER = 5.2.3
43+
LIB_GRAPHQL_SERVLET_VER = 6.1.3
44+
LIB_GRAPHQL_JAVA_TOOLS_VER = 5.2.4
4545
LIB_COMMONS_IO_VER = 2.6
4646

4747
GRADLE_WRAPPER_VER = 4.7

graphiql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphiql/boot/GraphiQLController.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,15 @@ public class GraphiQLController {
3333

3434
private static final String CDNJS_CLOUDFLARE_COM_AJAX_LIBS_GRAPHIQL = "//cdnjs.cloudflare.com/ajax/libs/graphiql/";
3535

36-
@Value("${graphiql.endpoint:/graphql}")
36+
@Value("${graphiql.endpoint.graphql:/graphql}")
3737
private String graphqlEndpoint;
3838

39+
@Value("${graphiql.endpoint.subscriptions:/subscriptions}")
40+
private String subscriptionsEndpoint;
41+
42+
@Value("${graphiql.static.basePath:/}")
43+
private String staticBasePath;
44+
3945
@Value("${graphiql.pageTitle:GraphiQL}")
4046
private String pageTitle;
4147

@@ -87,17 +93,21 @@ private void addIfAbsent(Properties headerProperties, String header) {
8793
public void graphiql(HttpServletRequest request, HttpServletResponse response, @PathVariable Map<String, String> params) throws IOException {
8894
response.setContentType("text/html; charset=UTF-8");
8995

90-
String endpoint = constructGraphQlEndpoint(request, params);
91-
Map<String, String> replacements = getReplacements(endpoint);
96+
Map<String, String> replacements = getReplacements(
97+
constructGraphQlEndpoint(request, params),
98+
request.getContextPath() + subscriptionsEndpoint,
99+
request.getContextPath() + staticBasePath
100+
);
92101

93102
String populatedTemplate = StrSubstitutor.replace(template, replacements);
94-
populatedTemplate = addContextPathIfEnabled(request, populatedTemplate);
95103
response.getOutputStream().write(populatedTemplate.getBytes(Charset.defaultCharset()));
96104
}
97105

98-
private Map<String, String> getReplacements(String endpoint) {
106+
private Map<String, String> getReplacements(String graphqlEndpoint, String subscriptionsEndpoint, String staticBasePath) {
99107
Map<String, String> replacements = new HashMap<>();
100-
replacements.put("graphqlEndpoint", endpoint);
108+
replacements.put("graphqlEndpoint", graphqlEndpoint);
109+
replacements.put("subscriptionsEndpoint", subscriptionsEndpoint);
110+
replacements.put("staticBasePath", staticBasePath);
101111
replacements.put("pageTitle", pageTitle);
102112
replacements.put("graphiqlCssUrl", graphiqlUrl("graphiql.min.css"));
103113
replacements.put("graphiqlJsUrl", graphiqlUrl("graphiql.min.js"));
@@ -110,17 +120,7 @@ private String graphiqlUrl(String filename) {
110120
if (graphiqlCdnEnabled && StringUtils.isNotBlank(graphiqlCdnVersion)) {
111121
return CDNJS_CLOUDFLARE_COM_AJAX_LIBS_GRAPHIQL + graphiqlCdnVersion + "/" + filename;
112122
}
113-
return "/vendor/" + filename;
114-
}
115-
116-
private String addContextPathIfEnabled(HttpServletRequest request, String populatedTemplate) {
117-
if (StringUtils.isNotBlank(request.getContextPath())) {
118-
String vendorPathWithContext = String.format("%s/vendor", request.getContextPath());
119-
populatedTemplate = populatedTemplate
120-
.replaceAll("src=\"/vendor", "src=\"" + vendorPathWithContext)
121-
.replaceAll("href=\"/vendor", "href=\"" + vendorPathWithContext);
122-
}
123-
return populatedTemplate;
123+
return staticBasePath + "vendor/" + filename;
124124
}
125125

126126
private String constructGraphQlEndpoint(HttpServletRequest request, @RequestParam Map<String, String> params) {

graphiql-spring-boot-autoconfigure/src/main/resources/graphiql.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
}
2525
</style>
2626

27-
<script src="/vendor/es6-promise.auto.min.js"></script>
28-
<script src="/vendor/fetch.min.js"></script>
29-
<script src="/vendor/react.min.js"></script>
30-
<script src="/vendor/react-dom.min.js"></script>
27+
<script src="${staticBasePath}vendor/es6-promise.auto.min.js"></script>
28+
<script src="${staticBasePath}vendor/fetch.min.js"></script>
29+
<script src="${staticBasePath}vendor/react.min.js"></script>
30+
<script src="${staticBasePath}vendor/react-dom.min.js"></script>
3131

3232
<link rel="stylesheet" href="${graphiqlCssUrl}"/>
3333
<script src="${graphiqlJsUrl}"></script>
@@ -121,7 +121,7 @@
121121
newUri = "ws:";
122122
}
123123
newUri += "//" + loc.host;
124-
newUri += "/subscriptions";
124+
newUri += "${subscriptionsEndpoint}";
125125

126126
var subscriptionsClient = new window.SubscriptionsTransportWs.SubscriptionClient(newUri, { reconnect: true });
127127
var subscriptionsFetcher = window.GraphiQLSubscriptionsFetcher.graphQLFetcher(subscriptionsClient, graphQLFetcher);

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)