16
16
17
17
package org .springframework .graphql .server .webmvc ;
18
18
19
- import java .util .Arrays ;
20
19
import java .util .List ;
20
+ import java .util .Map ;
21
21
import java .util .concurrent .CompletableFuture ;
22
22
import java .util .concurrent .ExecutionException ;
23
23
24
24
import jakarta .servlet .ServletException ;
25
25
26
26
import org .springframework .context .i18n .LocaleContextHolder ;
27
- import org .springframework .graphql .GraphQlResponse ;
28
27
import org .springframework .graphql .server .WebGraphQlHandler ;
29
28
import org .springframework .graphql .server .WebGraphQlRequest ;
30
- import org .springframework .http .HttpMethod ;
31
29
import org .springframework .http .MediaType ;
32
30
import org .springframework .http .converter .HttpMessageConverter ;
33
31
import org .springframework .http .server .ServletServerHttpResponse ;
47
45
public class GraphQlHttpHandler extends AbstractGraphQlHttpHandler {
48
46
49
47
@ SuppressWarnings ("removal" )
50
- private static final List <MediaType > SUPPORTED_MEDIA_TYPES =
51
- Arrays . asList ( MediaType .APPLICATION_GRAPHQL_RESPONSE , MediaType .APPLICATION_JSON , MediaType .APPLICATION_GRAPHQL );
48
+ private static final List <MediaType > SUPPORTED_MEDIA_TYPES = List . of (
49
+ MediaType .APPLICATION_GRAPHQL_RESPONSE , MediaType .APPLICATION_JSON , MediaType .APPLICATION_GRAPHQL );
52
50
53
51
54
52
/**
@@ -62,27 +60,28 @@ public GraphQlHttpHandler(WebGraphQlHandler graphQlHandler) {
62
60
/**
63
61
* Create a new instance with a custom message converter.
64
62
* <p>If no converter is provided, this will use
65
- * {@link org.springframework.web.servlet.config.annotation.WebMvcConfigurer#configureMessageConverters(List) the one configured in the web framework}.
63
+ * {@link org.springframework.web.servlet.config.annotation.WebMvcConfigurer#configureMessageConverters(List)
64
+ * the one configured in the web framework}.
66
65
* @param graphQlHandler common handler for GraphQL over HTTP requests
67
- * @param messageConverter custom {@link HttpMessageConverter} to be used for encoding and decoding GraphQL payloads
66
+ * @param converter custom {@link HttpMessageConverter} to read and write GraphQL payloads
68
67
*/
69
- public GraphQlHttpHandler (WebGraphQlHandler graphQlHandler , @ Nullable HttpMessageConverter <?> messageConverter ) {
70
- super (graphQlHandler , messageConverter );
68
+ public GraphQlHttpHandler (WebGraphQlHandler graphQlHandler , @ Nullable HttpMessageConverter <?> converter ) {
69
+ super (graphQlHandler , converter );
71
70
}
72
71
73
72
/**
74
73
* Handle GraphQL requests over HTTP.
75
- * @param serverRequest the incoming HTTP request
74
+ * @param request the incoming HTTP request
76
75
* @return the HTTP response
77
76
* @throws ServletException may be raised when reading the request body, e.g.
78
77
* {@link HttpMediaTypeNotSupportedException}.
79
78
*/
80
- public ServerResponse handleRequest (ServerRequest serverRequest ) throws ServletException {
79
+ public ServerResponse handleRequest (ServerRequest request ) throws ServletException {
81
80
82
81
WebGraphQlRequest graphQlRequest = new WebGraphQlRequest (
83
- serverRequest .uri (), serverRequest .headers ().asHttpHeaders (), initCookies (serverRequest ),
84
- serverRequest .remoteAddress ().orElse (null ),
85
- serverRequest .attributes (), readBody (serverRequest ), this .idGenerator .generateId ().toString (),
82
+ request .uri (), request .headers ().asHttpHeaders (), initCookies (request ),
83
+ request .remoteAddress ().orElse (null ),
84
+ request .attributes (), readBody (request ), this .idGenerator .generateId ().toString (),
86
85
LocaleContextHolder .getLocale ());
87
86
88
87
if (logger .isDebugEnabled ()) {
@@ -94,13 +93,13 @@ public ServerResponse handleRequest(ServerRequest serverRequest) throws ServletE
94
93
if (logger .isDebugEnabled ()) {
95
94
logger .debug ("Execution complete" );
96
95
}
97
- MediaType contentType = selectResponseMediaType (serverRequest );
96
+ MediaType contentType = selectResponseMediaType (request );
98
97
ServerResponse .BodyBuilder builder = ServerResponse .ok ();
99
98
builder .headers ((headers ) -> headers .putAll (response .getResponseHeaders ()));
100
99
builder .contentType (contentType );
101
100
102
101
if (this .messageConverter != null ) {
103
- return builder .build (writeFunction (contentType , response ));
102
+ return builder .build (writeFunction (this . messageConverter , contentType , response . toMap () ));
104
103
}
105
104
else {
106
105
return builder .body (response .toMap ());
@@ -132,16 +131,13 @@ private static MediaType selectResponseMediaType(ServerRequest serverRequest) {
132
131
return MediaType .APPLICATION_JSON ;
133
132
}
134
133
135
- private ServerResponse .HeadersBuilder .WriteFunction writeFunction (MediaType contentType , GraphQlResponse response ) {
134
+ private static ServerResponse .HeadersBuilder .WriteFunction writeFunction (
135
+ HttpMessageConverter <Object > converter , MediaType contentType , Map <String , Object > resultMap ) {
136
+
136
137
return (servletRequest , servletResponse ) -> {
137
- if (messageConverter != null ) {
138
- ServletServerHttpResponse httpResponse = new ServletServerHttpResponse (servletResponse );
139
- messageConverter .write (response .toMap (), contentType , httpResponse );
140
- return null ;
141
- }
142
- else {
143
- throw new HttpMediaTypeNotSupportedException (contentType , SUPPORTED_MEDIA_TYPES , HttpMethod .POST );
144
- }
138
+ ServletServerHttpResponse httpResponse = new ServletServerHttpResponse (servletResponse );
139
+ converter .write (resultMap , contentType , httpResponse );
140
+ return null ;
145
141
};
146
142
}
147
143
0 commit comments