Skip to content

Commit aa35a1e

Browse files
dariuszkucsmyrick
authored andcommitted
[spring-server] use data classes for configuration properties (ExpediaGroup#445)
SpringBoot 2.2 supports using immutable data classes for `ConfigurationProperties` by specifying `@ConstructorBinding`.
1 parent d0c0758 commit aa35a1e

File tree

9 files changed

+39
-52
lines changed

9 files changed

+39
-52
lines changed

examples/federation/base-app/src/main/kotlin/com/expediagroup/graphql/examples/Application.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616

1717
package com.expediagroup.graphql.examples
1818

19-
import com.expediagroup.graphql.federation.FederatedSchemaGeneratorConfig
20-
import com.expediagroup.graphql.federation.FederatedSchemaGeneratorHooks
21-
import com.expediagroup.graphql.federation.execution.FederatedTypeRegistry
2219
import com.expediagroup.graphql.examples.extension.CustomFederationSchemaGeneratorHooks
20+
import com.expediagroup.graphql.federation.execution.FederatedTypeRegistry
2321
import org.springframework.boot.autoconfigure.SpringBootApplication
2422
import org.springframework.boot.runApplication
2523
import org.springframework.context.annotation.Bean
@@ -29,12 +27,6 @@ class Application {
2927
@Bean
3028
fun hooks(federatedTypeRegistry: FederatedTypeRegistry) =
3129
CustomFederationSchemaGeneratorHooks(federatedTypeRegistry)
32-
33-
@Bean
34-
fun schemaConfig(hooks: FederatedSchemaGeneratorHooks): FederatedSchemaGeneratorConfig = FederatedSchemaGeneratorConfig(
35-
supportedPackages = listOf("com.expediagroup"),
36-
hooks = hooks
37-
)
3830
}
3931

4032
@Suppress("SpreadOperator")

examples/spring/src/main/kotlin/com/expediagroup/graphql/examples/Application.kt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616

1717
package com.expediagroup.graphql.examples
1818

19-
import com.expediagroup.graphql.SchemaGeneratorConfig
2019
import com.expediagroup.graphql.directives.KotlinDirectiveWiringFactory
21-
import com.expediagroup.graphql.execution.KotlinDataFetcherFactoryProvider
22-
import com.expediagroup.graphql.hooks.SchemaGeneratorHooks
2320
import com.expediagroup.graphql.examples.datafetchers.CustomDataFetcherFactoryProvider
2421
import com.expediagroup.graphql.examples.datafetchers.SpringDataFetcherFactory
2522
import com.expediagroup.graphql.examples.directives.CustomDirectiveWiringFactory
2623
import com.expediagroup.graphql.examples.exceptions.CustomDataFetcherExceptionHandler
2724
import com.expediagroup.graphql.examples.extension.CustomSchemaGeneratorHooks
25+
import com.expediagroup.graphql.hooks.SchemaGeneratorHooks
2826
import graphql.execution.DataFetcherExceptionHandler
2927
import org.springframework.boot.autoconfigure.SpringBootApplication
3028
import org.springframework.boot.runApplication
@@ -45,13 +43,6 @@ class Application {
4543
fun dataFetcherFactoryProvider(springDataFetcherFactory: SpringDataFetcherFactory, hooks: SchemaGeneratorHooks) =
4644
CustomDataFetcherFactoryProvider(springDataFetcherFactory, hooks)
4745

48-
@Bean
49-
fun schemaConfig(hooks: SchemaGeneratorHooks, dataFetcherFactoryProvider: KotlinDataFetcherFactoryProvider): SchemaGeneratorConfig = SchemaGeneratorConfig(
50-
supportedPackages = listOf("com.expediagroup"),
51-
hooks = hooks,
52-
dataFetcherFactoryProvider = dataFetcherFactoryProvider
53-
)
54-
5546
@Bean
5647
fun dataFetcherExceptionHandler(): DataFetcherExceptionHandler = CustomDataFetcherExceptionHandler()
5748
}
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
graphql:
2+
packages: "com.expediagroup.graphql.examples"
23
subscriptions:
34
# Send a ka message every 1000 ms (1 second)
45
keepAliveInterval: 1000
5-
6-
playground:
7-
enabled: true
8-
endpoint: "/"

graphql-kotlin-spring-server/src/main/kotlin/com/expediagroup/graphql/spring/GraphQLConfigurationProperties.kt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,45 +17,47 @@
1717
package com.expediagroup.graphql.spring
1818

1919
import org.springframework.boot.context.properties.ConfigurationProperties
20+
import org.springframework.boot.context.properties.ConstructorBinding
2021

2122
/**
2223
* [ConfigurationProperties] bean that defines supported GraphQL configuration options.
2324
*/
25+
@ConstructorBinding
2426
@ConfigurationProperties("graphql")
25-
class GraphQLConfigurationProperties {
27+
data class GraphQLConfigurationProperties(
2628
/** GraphQL server endpoint, defaults to 'graphql' */
27-
var endpoint: String = "graphql"
29+
val endpoint: String = "graphql",
2830
/** List of supported packages that can contain GraphQL schema type definitions */
29-
var packages: List<String> = emptyList()
30-
var federation: FederationConfigurationProperties = FederationConfigurationProperties()
31-
var subscriptions: SubscriptionConfigurationProperties = SubscriptionConfigurationProperties()
32-
var playground: PlaygroundConfigurationProperties = PlaygroundConfigurationProperties()
33-
}
31+
val packages: List<String>,
32+
val federation: FederationConfigurationProperties = FederationConfigurationProperties(),
33+
val subscriptions: SubscriptionConfigurationProperties = SubscriptionConfigurationProperties(),
34+
val playground: PlaygroundConfigurationProperties = PlaygroundConfigurationProperties()
35+
)
3436

3537
/**
3638
* Apollo Federation configuration properties.
3739
*/
38-
class FederationConfigurationProperties {
40+
data class FederationConfigurationProperties(
3941
/** Boolean flag indicating whether to generate federated GraphQL model */
40-
var enabled: Boolean = false
41-
}
42+
val enabled: Boolean = false
43+
)
4244

4345
/**
4446
* GraphQL subscription configuration properties.
4547
*/
46-
class SubscriptionConfigurationProperties {
48+
data class SubscriptionConfigurationProperties(
4749
/** GraphQL subscriptions endpoint, defaults to 'subscriptions' */
48-
var endpoint: String = "subscriptions"
50+
val endpoint: String = "subscriptions",
4951
/** Keep the websocket alive and send a message to the client every interval in ms. Default to not sending messages */
50-
var keepAliveInterval: Long? = null
51-
}
52+
val keepAliveInterval: Long? = null
53+
)
5254

5355
/**
5456
* Playground configuration properties.
5557
*/
56-
class PlaygroundConfigurationProperties {
58+
data class PlaygroundConfigurationProperties(
5759
/** Boolean flag indicating whether to enabled Prisma Labs Playground GraphQL IDE */
58-
var enabled: Boolean = true
59-
/** Prisma Labs Playground GraphQL IDE endpoint, defaults to "/playground" */
60-
var endpoint: String = "/playground"
61-
}
60+
val enabled: Boolean = true,
61+
/** Prisma Labs Playground GraphQL IDE endpoint, defaults to 'playground' */
62+
val endpoint: String = "playground"
63+
)

graphql-kotlin-spring-server/src/main/resources/META-INF/spring-configuration-metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"name": "graphql.playground.endpoint",
3939
"type": "java.lang.String",
4040
"sourceType": "com.expediagroup.graphql.spring.PlaygroundConfigurationProperties",
41-
"defaultValue": "/playground"
41+
"defaultValue": "playground"
4242
}
4343
]
4444
}

graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/spring/FederationConfigurationTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class FederationConfigurationTest {
8383
@Test
8484
fun `verify federated schema auto configuration backs off in beans are defined by user`() {
8585
contextRunner.withUserConfiguration(CustomFederatedConfiguration::class.java)
86+
.withPropertyValues("graphql.packages=com.expediagroup.graphql.spring", "graphql.federation.enabled=true")
8687
.run { ctx ->
8788
val customConfiguration = ctx.getBean(CustomFederatedConfiguration::class.java)
8889

@@ -119,7 +120,7 @@ class FederationConfigurationTest {
119120
fun objectMapper(): ObjectMapper = jacksonObjectMapper()
120121

121122
@Bean
122-
fun customSchemaConfig(): SchemaGeneratorConfig = FederatedSchemaGeneratorConfig(
123+
fun customSchemaConfig(): FederatedSchemaGeneratorConfig = FederatedSchemaGeneratorConfig(
123124
supportedPackages = listOf("com.expediagroup"),
124125
hooks = FederatedSchemaGeneratorHooks(FederatedTypeRegistry())
125126
)

graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/spring/SchemaConfigurationTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class SchemaConfigurationTest {
8282
@Test
8383
fun `verify schema auto configuration backs off in beans are defined by user`() {
8484
contextRunner.withUserConfiguration(CustomConfiguration::class.java)
85+
.withPropertyValues("graphql.packages=com.expediagroup.graphql.spring")
8586
.run { ctx ->
8687
val customConfiguration = ctx.getBean(CustomConfiguration::class.java)
8788

graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/spring/SubscriptionConfigurationTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class SubscriptionConfigurationTest {
7474
@Test
7575
fun `verify subscription auto configuration backs off in beans are defined by user`() {
7676
contextRunner.withUserConfiguration(CustomSubscriptionConfiguration::class.java)
77+
.withPropertyValues("graphql.packages=com.expediagroup.graphql.spring")
7778
.run { ctx ->
7879
val customConfiguration = ctx.getBean(CustomSubscriptionConfiguration::class.java)
7980

graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/spring/context/ContextWebFilterTest.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.expediagroup.graphql.spring.context
1818

1919
import com.expediagroup.graphql.spring.GraphQLConfigurationProperties
20+
import com.expediagroup.graphql.spring.SubscriptionConfigurationProperties
2021
import com.expediagroup.graphql.spring.execution.ContextWebFilter
2122
import com.expediagroup.graphql.spring.execution.GRAPHQL_CONTEXT_KEY
2223
import com.expediagroup.graphql.spring.execution.GraphQLContextFactory
@@ -58,7 +59,7 @@ class ContextWebFilterTest {
5859
coEvery { generateContext(any(), any()) } returns GraphQLContext.newContext().build()
5960
}
6061

61-
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(), simpleFactory)
62+
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(packages = listOf("com.expediagroup.graphql")), simpleFactory)
6263
StepVerifier.create(contextFilter.filter(exchange, chain))
6364
.verifyComplete()
6465

@@ -69,7 +70,7 @@ class ContextWebFilterTest {
6970

7071
@Test
7172
fun `verify web filter order`() {
72-
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(), mockk())
73+
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(packages = listOf("com.expediagroup.graphql")), mockk())
7374
assertEquals(expected = 0, actual = contextFilter.order)
7475
}
7576

@@ -94,7 +95,7 @@ class ContextWebFilterTest {
9495
coEvery { generateContext(any(), any()) } returns GraphQLContext.newContext().build()
9596
}
9697

97-
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(), simpleFactory)
98+
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(packages = listOf("com.expediagroup.graphql")), simpleFactory)
9899
StepVerifier.create(contextFilter.filter(exchange, chain))
99100
.verifyComplete()
100101

@@ -104,7 +105,7 @@ class ContextWebFilterTest {
104105

105106
@Test
106107
fun `verify context web filter is applicable on default graphql routes`() {
107-
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(), mockk())
108+
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(packages = listOf("com.expediagroup.graphql")), mockk())
108109
for (path in listOf("/graphql", "/subscriptions")) {
109110
assertTrue(contextFilter.isApplicable(path))
110111
}
@@ -114,9 +115,10 @@ class ContextWebFilterTest {
114115
fun `verify context web filter is applicable on non-default graphql routes`() {
115116
val graphQLRoute = "myGraphQL"
116117
val subscriptionRoute = "mySubscription"
117-
val props = GraphQLConfigurationProperties()
118-
props.endpoint = graphQLRoute
119-
props.subscriptions.endpoint = subscriptionRoute
118+
val props = GraphQLConfigurationProperties(
119+
endpoint = graphQLRoute,
120+
packages = listOf("com.expediagroup.graphql"),
121+
subscriptions = SubscriptionConfigurationProperties(endpoint = subscriptionRoute))
120122

121123
val contextFilter = ContextWebFilter(props, mockk())
122124
for (path in listOf("/${graphQLRoute.toLowerCase()}", "/${subscriptionRoute.toLowerCase()}")) {
@@ -126,7 +128,7 @@ class ContextWebFilterTest {
126128

127129
@Test
128130
fun `verify context web filter is not applicable on non graphql routes`() {
129-
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(), mockk())
131+
val contextFilter = ContextWebFilter(GraphQLConfigurationProperties(packages = listOf("com.expediagroup.graphql")), mockk())
130132
assertFalse(contextFilter.isApplicable("/whatever"))
131133
}
132134
}

0 commit comments

Comments
 (0)