From 7160f274eec0bba971abd56923146abcd4dcff82 Mon Sep 17 00:00:00 2001 From: CyberZujo Date: Sun, 3 Nov 2024 12:17:41 +0100 Subject: [PATCH 1/5] https://github.com/spring-projects-experimental/spring-grpc/issues/26 - Add autoconfig for reflection service and friends #26 Signed-off-by: CyberZujo --- .../src/main/resources/application.properties | 1 + spring-grpc-spring-boot-autoconfigure/pom.xml | 6 +++- ...GrpcServerReflectionAutoConfiguration.java | 30 ++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 2 ++ ...erverReflectionAutoConfigurationTests.java | 34 +++++++++++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java create mode 100644 spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java diff --git a/samples/grpc-server/src/main/resources/application.properties b/samples/grpc-server/src/main/resources/application.properties index 566605a7..46f55c54 100644 --- a/samples/grpc-server/src/main/resources/application.properties +++ b/samples/grpc-server/src/main/resources/application.properties @@ -1 +1,2 @@ spring.application.name=grpc-server +grpc.server.reflection.enabled=false \ No newline at end of file diff --git a/spring-grpc-spring-boot-autoconfigure/pom.xml b/spring-grpc-spring-boot-autoconfigure/pom.xml index 35521a06..04095f1e 100644 --- a/spring-grpc-spring-boot-autoconfigure/pom.xml +++ b/spring-grpc-spring-boot-autoconfigure/pom.xml @@ -88,7 +88,11 @@ spring-boot-starter-test test + + io.grpc + grpc-services + - + \ No newline at end of file diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java new file mode 100644 index 00000000..faf2d975 --- /dev/null +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java @@ -0,0 +1,30 @@ +package org.springframework.grpc.autoconfigure.server; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.grpc.BindableService; +import io.grpc.protobuf.services.ProtoReflectionService; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for gRPC Reflection service + *

+ * grpc.reflection.enabled=true must be present in configuration in order for the + * auto-configuration to execute + * + * @author Haris Zujo + */ +@Configuration +@ConditionalOnClass(BindableService.class) +public class GrpcServerReflectionAutoConfiguration { + + @Bean + @ConditionalOnProperty(name = "grpc.server.reflection.enabled", havingValue = "true") + public BindableService serverReflection() { + return ProtoReflectionService.newInstance(); + } + +} diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index a7e2a86e..8322bec2 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,5 @@ org.springframework.grpc.autoconfigure.server.GrpcServerFactoryAutoConfiguration org.springframework.grpc.autoconfigure.server.GrpcServerAutoConfiguration org.springframework.grpc.autoconfigure.client.GrpcClientAutoConfiguration +org.springframework.grpc.autoconfigure.server.GrpcServerReflectionAutoConfiguration + diff --git a/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java b/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java new file mode 100644 index 00000000..2738b86b --- /dev/null +++ b/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java @@ -0,0 +1,34 @@ +package org.springframework.grpc.autoconfigure.server; + +import io.grpc.BindableService; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.grpc.server.lifecycle.GrpcServerLifecycle; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GrpcServerReflectionAutoConfigurationTests { + + private ApplicationContextRunner contextRunner() { + return new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(GrpcServerReflectionAutoConfiguration.class)) + .withBean("noopServerLifecylcle", GrpcServerLifecycle.class, Mockito::mock); + } + + @Test + void whenReflectionEnabledThenCreateBean() { + this.contextRunner() + .withPropertyValues("grpc.server.reflection.enabled=true") + .run((context) -> assertThat(context).hasSingleBean(BindableService.class)); + } + + @Test + void whenReflectionDisabledThenSkipBeanCreation() { + this.contextRunner() + .withPropertyValues("grpc.server.reflection.enabled=false") + .run((context) -> assertThat(context).doesNotHaveBean(BindableService.class)); + } + +} From fb744923ab8f9fc8aac1f1e4579dad1f5c65fc9d Mon Sep 17 00:00:00 2001 From: Haris Zujo Date: Tue, 5 Nov 2024 23:03:02 +0100 Subject: [PATCH 2/5] Update spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java Co-authored-by: Chris Bono --- .../server/GrpcServerReflectionAutoConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java index faf2d975..a7ede490 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java @@ -18,7 +18,7 @@ * @author Haris Zujo */ @Configuration -@ConditionalOnClass(BindableService.class) +@ConditionalOnClass(ProtoReflectionService.class) public class GrpcServerReflectionAutoConfiguration { @Bean From 2415c6c6f577b910321477b4cf3f4befe129a4cc Mon Sep 17 00:00:00 2001 From: CyberZujo Date: Sat, 9 Nov 2024 10:52:37 +0100 Subject: [PATCH 3/5] https://github.com/spring-projects-experimental/spring-grpc/issues/26 - Updates based on comments #26 Signed-off-by: CyberZujo --- .../grpc/sample/GrpcServerApplication.java | 9 --------- .../src/main/resources/application.properties | 2 +- .../grpc/sample/GrpcServerApplication.java | 10 ---------- spring-grpc-spring-boot-autoconfigure/pom.xml | 9 +++++---- .../server/GrpcServerFactoryAutoConfiguration.java | 2 ++ .../server/GrpcServerReflectionAutoConfiguration.java | 9 ++++----- .../additional-spring-configuration-metadata.json | 4 ++++ .../GrpcServerReflectionAutoConfigurationTests.java | 10 ++++++++-- 8 files changed, 24 insertions(+), 31 deletions(-) diff --git a/samples/grpc-server/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java b/samples/grpc-server/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java index d6052094..91ed5dd7 100644 --- a/samples/grpc-server/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java +++ b/samples/grpc-server/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java @@ -2,10 +2,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import io.grpc.BindableService; -import io.grpc.protobuf.services.ProtoReflectionService; @SpringBootApplication public class GrpcServerApplication { @@ -14,9 +10,4 @@ public static void main(String[] args) { SpringApplication.run(GrpcServerApplication.class, args); } - @Bean - public BindableService serverReflection() { - return ProtoReflectionService.newInstance(); - } - } diff --git a/samples/grpc-server/src/main/resources/application.properties b/samples/grpc-server/src/main/resources/application.properties index 46f55c54..0e228bd7 100644 --- a/samples/grpc-server/src/main/resources/application.properties +++ b/samples/grpc-server/src/main/resources/application.properties @@ -1,2 +1,2 @@ spring.application.name=grpc-server -grpc.server.reflection.enabled=false \ No newline at end of file +spring.grpc.server.reflection.enabled=true \ No newline at end of file diff --git a/samples/grpc-tomcat/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java b/samples/grpc-tomcat/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java index d6052094..5cf22b1a 100644 --- a/samples/grpc-tomcat/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java +++ b/samples/grpc-tomcat/src/main/java/org/springframework/grpc/sample/GrpcServerApplication.java @@ -2,10 +2,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import io.grpc.BindableService; -import io.grpc.protobuf.services.ProtoReflectionService; @SpringBootApplication public class GrpcServerApplication { @@ -13,10 +9,4 @@ public class GrpcServerApplication { public static void main(String[] args) { SpringApplication.run(GrpcServerApplication.class, args); } - - @Bean - public BindableService serverReflection() { - return ProtoReflectionService.newInstance(); - } - } diff --git a/spring-grpc-spring-boot-autoconfigure/pom.xml b/spring-grpc-spring-boot-autoconfigure/pom.xml index 04095f1e..61dbbf0a 100644 --- a/spring-grpc-spring-boot-autoconfigure/pom.xml +++ b/spring-grpc-spring-boot-autoconfigure/pom.xml @@ -60,6 +60,11 @@ grpc-servlet-jakarta true + + io.grpc + grpc-services + true + io.grpc grpc-netty-shaded @@ -88,10 +93,6 @@ spring-boot-starter-test test - - io.grpc - grpc-services - diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerFactoryAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerFactoryAutoConfiguration.java index 0c5df785..1b0952de 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerFactoryAutoConfiguration.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerFactoryAutoConfiguration.java @@ -23,6 +23,7 @@ import io.grpc.servlet.jakarta.ServletServerBuilder; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -48,6 +49,7 @@ * @author Toshiaki Maki */ @AutoConfiguration +@AutoConfigureAfter(GrpcServerReflectionAutoConfiguration.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass(BindableService.class) @ConditionalOnBean(BindableService.class) diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java index a7ede490..aa2c2665 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java @@ -1,10 +1,10 @@ package org.springframework.grpc.autoconfigure.server; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import io.grpc.BindableService; import io.grpc.protobuf.services.ProtoReflectionService; @@ -12,19 +12,18 @@ /** * {@link EnableAutoConfiguration Auto-configuration} for gRPC Reflection service *

- * grpc.reflection.enabled=true must be present in configuration in order for the + * spring.grpc.reflection.enabled=true must be present in configuration in order for the * auto-configuration to execute * * @author Haris Zujo */ -@Configuration +@AutoConfiguration @ConditionalOnClass(ProtoReflectionService.class) +@ConditionalOnProperty(name = "spring.grpc.server.reflection.enabled", havingValue = "true", matchIfMissing = true) public class GrpcServerReflectionAutoConfiguration { @Bean - @ConditionalOnProperty(name = "grpc.server.reflection.enabled", havingValue = "true") public BindableService serverReflection() { return ProtoReflectionService.newInstance(); } - } diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 7102b598..ceb06f05 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-grpc-spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -4,6 +4,10 @@ { "name": "spring.grpc.server.port", "defaultValue": "9090" + }, + { + "name": "spring.grpc.server.reflection.enabled", + "defaultValue": "true" } ] } diff --git a/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java b/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java index 2738b86b..5e4d37cb 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java +++ b/spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfigurationTests.java @@ -17,17 +17,23 @@ private ApplicationContextRunner contextRunner() { .withBean("noopServerLifecylcle", GrpcServerLifecycle.class, Mockito::mock); } + @Test + void whenReflectionEnabledFlagNotPresentThenCreateDefaultBean() { + this.contextRunner() + .run((context -> assertThat(context).hasSingleBean(BindableService.class))); + } + @Test void whenReflectionEnabledThenCreateBean() { this.contextRunner() - .withPropertyValues("grpc.server.reflection.enabled=true") + .withPropertyValues("spring.grpc.server.reflection.enabled=true") .run((context) -> assertThat(context).hasSingleBean(BindableService.class)); } @Test void whenReflectionDisabledThenSkipBeanCreation() { this.contextRunner() - .withPropertyValues("grpc.server.reflection.enabled=false") + .withPropertyValues("spring.grpc.server.reflection.enabled=false") .run((context) -> assertThat(context).doesNotHaveBean(BindableService.class)); } From 507ade0e7f1fb8bda498222c30a131de6db2e8c6 Mon Sep 17 00:00:00 2001 From: CyberZujo Date: Sat, 9 Nov 2024 11:11:33 +0100 Subject: [PATCH 4/5] https://github.com/spring-projects-experimental/spring-grpc/issues/26 - GrpcServerReflectionAutoConfiguration description update #26 Signed-off-by: CyberZujo --- .../server/GrpcServerReflectionAutoConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java index aa2c2665..ec1a667f 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java @@ -12,7 +12,8 @@ /** * {@link EnableAutoConfiguration Auto-configuration} for gRPC Reflection service *

- * spring.grpc.reflection.enabled=true must be present in configuration in order for the + * This auto-configuration is enabled by default. To disable it, set the configuration + * flag {spring.grpc.server.reflection.enabled=false} in your application properties. * auto-configuration to execute * * @author Haris Zujo From 05f518c9a6a161eafa25c8e98b631e79a33938a0 Mon Sep 17 00:00:00 2001 From: CyberZujo Date: Sat, 9 Nov 2024 11:20:23 +0100 Subject: [PATCH 5/5] https://github.com/spring-projects-experimental/spring-grpc/issues/26 - Fix formatting #26 Signed-off-by: CyberZujo --- .../server/GrpcServerReflectionAutoConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java index ec1a667f..3a670af3 100644 --- a/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java +++ b/spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerReflectionAutoConfiguration.java @@ -27,4 +27,5 @@ public class GrpcServerReflectionAutoConfiguration { public BindableService serverReflection() { return ProtoReflectionService.newInstance(); } + }