1616
1717package org .springframework .boot .graphql .autoconfigure .rsocket ;
1818
19+ import com .fasterxml .jackson .databind .ObjectMapper ;
1920import graphql .GraphQL ;
2021import io .rsocket .core .RSocketServer ;
2122import reactor .netty .http .server .HttpServer ;
2425import org .springframework .beans .factory .ObjectProvider ;
2526import org .springframework .boot .autoconfigure .AutoConfiguration ;
2627import org .springframework .boot .autoconfigure .EnableAutoConfiguration ;
28+ import org .springframework .boot .autoconfigure .condition .AnyNestedCondition ;
2729import org .springframework .boot .autoconfigure .condition .ConditionalOnBean ;
2830import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
2931import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
32+ import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingClass ;
3033import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
3134import org .springframework .boot .graphql .autoconfigure .GraphQlAutoConfiguration ;
3235import org .springframework .context .annotation .Bean ;
36+ import org .springframework .context .annotation .Conditional ;
37+ import org .springframework .context .annotation .Configuration ;
38+ import org .springframework .core .codec .Encoder ;
3339import org .springframework .graphql .ExecutionGraphQlService ;
3440import org .springframework .graphql .data .method .annotation .support .AnnotatedControllerConfigurer ;
3541import org .springframework .graphql .execution .GraphQlSource ;
4652 * @since 4.0.0
4753 */
4854@ AutoConfiguration (after = GraphQlAutoConfiguration .class ,
49- afterName = "org.springframework.boot.rsocket.autoconfigure.RSocketMessagingAutoConfiguration" )
55+ afterName = { "org.springframework.boot.rsocket.autoconfigure.RSocketMessagingAutoConfiguration" ,
56+ "org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration" ,
57+ "org.springframework.boot.jackson2.autoconfigure.Jackson2AutoConfiguration" })
5058@ ConditionalOnClass ({ GraphQL .class , GraphQlSource .class , RSocketServer .class , HttpServer .class })
5159@ ConditionalOnBean ({ RSocketMessageHandler .class , AnnotatedControllerConfigurer .class })
5260@ ConditionalOnProperty ("spring.graphql.rsocket.mapping" )
@@ -55,9 +63,9 @@ public final class GraphQlRSocketAutoConfiguration {
5563 @ Bean
5664 @ ConditionalOnMissingBean
5765 GraphQlRSocketHandler graphQlRSocketHandler (ExecutionGraphQlService graphQlService ,
58- ObjectProvider <RSocketGraphQlInterceptor > interceptors , JsonMapper jsonMapper ) {
66+ ObjectProvider <RSocketGraphQlInterceptor > interceptors , JsonEncoderSupplier jsonEncoderSupplier ) {
5967 return new GraphQlRSocketHandler (graphQlService , interceptors .orderedStream ().toList (),
60- new JacksonJsonEncoder ( jsonMapper ));
68+ jsonEncoderSupplier . jsonEncoder ( ));
6169 }
6270
6371 @ Bean
@@ -66,4 +74,55 @@ GraphQlRSocketController graphQlRSocketController(GraphQlRSocketHandler handler)
6674 return new GraphQlRSocketController (handler );
6775 }
6876
77+ interface JsonEncoderSupplier {
78+
79+ Encoder <?> jsonEncoder ();
80+
81+ }
82+
83+ @ Configuration (proxyBeanMethods = false )
84+ @ ConditionalOnBean (JsonMapper .class )
85+ @ ConditionalOnProperty (name = "spring.graphql.rsocket.preferred-json-mapper" , havingValue = "jackson" ,
86+ matchIfMissing = true )
87+ static class JacksonJsonEncoderSupplierConfiguration {
88+
89+ @ Bean
90+ JsonEncoderSupplier jacksonJsonEncoderSupplier (JsonMapper jsonMapper ) {
91+ return () -> new JacksonJsonEncoder (jsonMapper );
92+ }
93+
94+ }
95+
96+ @ Configuration (proxyBeanMethods = false )
97+ @ ConditionalOnBean (ObjectMapper .class )
98+ @ Conditional (NoJacksonOrJackson2Preferred .class )
99+ @ Deprecated (since = "4.0.0" , forRemoval = true )
100+ @ SuppressWarnings ("removal" )
101+ static class Jackson2JsonEncoderSupplierConfiguration {
102+
103+ @ Bean
104+ JsonEncoderSupplier jackson2JsonEncoderSupplier (ObjectMapper objectMapper ) {
105+ return () -> new org .springframework .http .codec .json .Jackson2JsonEncoder (objectMapper );
106+ }
107+
108+ }
109+
110+ static class NoJacksonOrJackson2Preferred extends AnyNestedCondition {
111+
112+ NoJacksonOrJackson2Preferred () {
113+ super (ConfigurationPhase .PARSE_CONFIGURATION );
114+ }
115+
116+ @ ConditionalOnMissingClass ("tools.jackson.databind.json.JsonMapper" )
117+ static class NoJackson {
118+
119+ }
120+
121+ @ ConditionalOnProperty (name = "spring.graphql.rsocket.preferred-json-mapper" , havingValue = "jackson2" )
122+ static class Jackson2Preferred {
123+
124+ }
125+
126+ }
127+
69128}
0 commit comments