Skip to content

Commit c232213

Browse files
committed
Incorporate feedback from server code review
Consolidate the conditional annotations into an aggregate that checks for server and service enabled as well as one that checks that Spring gRPC is on the classpath. Signed-off-by: onobc <[email protected]>
1 parent 5c81286 commit c232213

19 files changed

+366
-52
lines changed

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/ConditionalOnGrpcServerEnabled.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,29 @@
2121
import java.lang.annotation.RetentionPolicy;
2222
import java.lang.annotation.Target;
2323

24-
import io.grpc.BindableService;
25-
26-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2824
import org.springframework.context.annotation.Conditional;
2925

3026
/**
31-
* {@link Conditional @Conditional} that only matches when the
32-
* {@code io.grpc.BindableService} class is on the classpath and the
33-
* {@code spring.grpc.server.enabled} property is not explicitly set to {@code false}.
27+
* {@link Conditional @Conditional} that checks whether the gRPC server and optionally a
28+
* specific gRPC service is enabled. It matches if the value of the
29+
* {@code spring.grpc.server.enabled} property is not explicitly set to {@code false} and
30+
* if the {@link #value() gRPC service name} is set, that the
31+
* {@code spring.grpc.server.<service-name>.enabled} property is not explicitly set to
32+
* {@code false}.
3433
*
3534
* @author Freeman Freeman
3635
* @author Chris Bono
3736
* @since 4.0.0
3837
*/
3938
@Retention(RetentionPolicy.RUNTIME)
4039
@Target({ ElementType.TYPE, ElementType.METHOD })
41-
@ConditionalOnClass(BindableService.class)
42-
@ConditionalOnProperty(prefix = "spring.grpc.server", name = "enabled", matchIfMissing = true)
40+
@Conditional(OnEnabledGrpcServerCondition.class)
4341
public @interface ConditionalOnGrpcServerEnabled {
4442

43+
/**
44+
* Name of the gRPC service.
45+
* @return the name of the gRPC service
46+
*/
47+
String value() default "";
48+
4549
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.grpc.server.autoconfigure;
18+
19+
import java.lang.annotation.ElementType;
20+
import java.lang.annotation.Retention;
21+
import java.lang.annotation.RetentionPolicy;
22+
import java.lang.annotation.Target;
23+
24+
import io.grpc.BindableService;
25+
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27+
import org.springframework.context.annotation.Conditional;
28+
import org.springframework.grpc.server.GrpcServerFactory;
29+
30+
/**
31+
* {@link Conditional @Conditional} that only matches when Spring gRPC is on the classpath
32+
* (i.e. {@link BindableService} and {@link GrpcServerFactory} are on the classpath).
33+
*
34+
* @author Freeman Freeman
35+
* @author Chris Bono
36+
* @since 4.0.0
37+
*/
38+
@Retention(RetentionPolicy.RUNTIME)
39+
@Target({ ElementType.TYPE, ElementType.METHOD })
40+
@ConditionalOnClass({ BindableService.class, GrpcServerFactory.class })
41+
public @interface ConditionalOnSpringGrpc {
42+
43+
}

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerAutoConfiguration.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.context.annotation.Import;
3535
import org.springframework.core.Ordered;
36-
import org.springframework.grpc.server.GrpcServerFactory;
3736
import org.springframework.grpc.server.ServerBuilderCustomizer;
3837
import org.springframework.grpc.server.exception.ReactiveStubBeanDefinitionRegistrar;
3938
import org.springframework.grpc.server.service.DefaultGrpcServiceConfigurer;
@@ -53,8 +52,8 @@
5352
* @since 4.0.0
5453
*/
5554
@AutoConfiguration(after = GrpcServerFactoryAutoConfiguration.class)
55+
@ConditionalOnSpringGrpc
5656
@ConditionalOnGrpcServerEnabled
57-
@ConditionalOnClass({ GrpcServerFactory.class })
5857
@ConditionalOnBean(BindableService.class)
5958
@EnableConfigurationProperties(GrpcServerProperties.class)
6059
@Import({ GrpcCodecConfiguration.class })

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerFactoryAutoConfiguration.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@
2828
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
2929
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
31-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3231
import org.springframework.boot.context.properties.PropertyMapper;
3332
import org.springframework.boot.web.servlet.ServletRegistrationBean;
3433
import org.springframework.context.annotation.Bean;
3534
import org.springframework.context.annotation.Configuration;
3635
import org.springframework.context.annotation.Import;
3736
import org.springframework.core.Ordered;
38-
import org.springframework.grpc.server.GrpcServerFactory;
3937
import org.springframework.grpc.server.service.GrpcServiceConfigurer;
4038
import org.springframework.grpc.server.service.GrpcServiceDiscoverer;
4139
import org.springframework.util.unit.DataSize;
@@ -53,8 +51,8 @@
5351
*/
5452
@AutoConfiguration
5553
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
54+
@ConditionalOnSpringGrpc
5655
@ConditionalOnGrpcServerEnabled
57-
@ConditionalOnClass(GrpcServerFactory.class)
5856
@ConditionalOnBean(BindableService.class)
5957
public final class GrpcServerFactoryAutoConfiguration {
6058

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerObservationAutoConfiguration.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@
2424
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2827
import org.springframework.context.annotation.Bean;
2928
import org.springframework.context.annotation.Configuration;
3029
import org.springframework.core.annotation.Order;
3130
import org.springframework.grpc.server.GlobalServerInterceptor;
32-
import org.springframework.grpc.server.GrpcServerFactory;
3331

3432
/**
3533
* {@link EnableAutoConfiguration Auto-configuration} for gRPC server-side observations.
@@ -41,10 +39,10 @@
4139
*/
4240
@AutoConfiguration(
4341
afterName = "org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration")
44-
@ConditionalOnGrpcServerEnabled
45-
@ConditionalOnClass({ GrpcServerFactory.class, ObservationRegistry.class, ObservationGrpcServerInterceptor.class })
42+
@ConditionalOnSpringGrpc
43+
@ConditionalOnClass({ ObservationRegistry.class, ObservationGrpcServerInterceptor.class })
44+
@ConditionalOnGrpcServerEnabled("observation")
4645
@ConditionalOnBean(ObservationRegistry.class)
47-
@ConditionalOnProperty(name = "spring.grpc.server.observation.enabled", havingValue = "true", matchIfMissing = true)
4846
public final class GrpcServerObservationAutoConfiguration {
4947

5048
@Bean

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/GrpcServerReflectionAutoConfiguration.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
26-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2726
import org.springframework.context.annotation.Bean;
28-
import org.springframework.grpc.server.GrpcServerFactory;
2927

3028
/**
3129
* {@link EnableAutoConfiguration Auto-configuration} for gRPC Reflection service
@@ -40,10 +38,10 @@
4038
* @since 4.0.0
4139
*/
4240
@AutoConfiguration(before = GrpcServerFactoryAutoConfiguration.class)
43-
@ConditionalOnGrpcServerEnabled
44-
@ConditionalOnClass({ GrpcServerFactory.class, ProtoReflectionServiceV1.class })
41+
@ConditionalOnSpringGrpc
42+
@ConditionalOnClass({ ProtoReflectionServiceV1.class })
43+
@ConditionalOnGrpcServerEnabled("reflection")
4544
@ConditionalOnBean(BindableService.class)
46-
@ConditionalOnProperty(name = "spring.grpc.server.reflection.enabled", havingValue = "true", matchIfMissing = true)
4745
public final class GrpcServerReflectionAutoConfiguration {
4846

4947
@Bean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.grpc.server.autoconfigure;
18+
19+
import java.util.Map;
20+
21+
import org.jspecify.annotations.Nullable;
22+
23+
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
24+
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
25+
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
26+
import org.springframework.context.annotation.ConditionContext;
27+
import org.springframework.core.type.AnnotatedTypeMetadata;
28+
import org.springframework.util.StringUtils;
29+
30+
/**
31+
* {@link SpringBootCondition} to check whether gRPC server/service is enabled.
32+
*
33+
* @author Chris Bono
34+
* @see ConditionalOnGrpcServerEnabled
35+
*/
36+
class OnEnabledGrpcServerCondition extends SpringBootCondition {
37+
38+
private static final String SERVER_PROPERTY = "spring.grpc.server.enabled";
39+
40+
private static final String SERVICE_PROPERTY = "spring.grpc.server.%s.enabled";
41+
42+
@Override
43+
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
44+
Boolean serverEnabled = context.getEnvironment().getProperty(SERVER_PROPERTY, Boolean.class);
45+
if (serverEnabled != null && !serverEnabled) {
46+
return new ConditionOutcome(serverEnabled,
47+
ConditionMessage.forCondition(ConditionalOnGrpcServerEnabled.class)
48+
.because(SERVER_PROPERTY + " is " + serverEnabled));
49+
}
50+
String serviceName = getServiceName(metadata);
51+
if (StringUtils.hasLength(serviceName)) {
52+
Boolean serviceEnabled = context.getEnvironment()
53+
.getProperty(SERVICE_PROPERTY.formatted(serviceName), Boolean.class);
54+
if (serviceEnabled != null) {
55+
return new ConditionOutcome(serviceEnabled,
56+
ConditionMessage.forCondition(ConditionalOnGrpcServerEnabled.class)
57+
.because(SERVICE_PROPERTY.formatted(serviceName) + " is " + serviceEnabled));
58+
}
59+
}
60+
return ConditionOutcome.match(ConditionMessage.forCondition(ConditionalOnGrpcServerEnabled.class)
61+
.because("server and service are enabled by default"));
62+
}
63+
64+
private static @Nullable String getServiceName(AnnotatedTypeMetadata metadata) {
65+
Map<String, @Nullable Object> attributes = metadata
66+
.getAnnotationAttributes(ConditionalOnGrpcServerEnabled.class.getName());
67+
if (attributes == null) {
68+
return null;
69+
}
70+
return (String) attributes.get("value");
71+
}
72+
73+
}

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/exception/GrpcExceptionHandlerAutoConfiguration.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,15 @@
1616

1717
package org.springframework.boot.grpc.server.autoconfigure.exception;
1818

19-
import io.grpc.Grpc;
20-
2119
import org.springframework.beans.factory.ObjectProvider;
2220
import org.springframework.boot.autoconfigure.AutoConfiguration;
2321
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2422
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
25-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2623
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
27-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2824
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnGrpcServerEnabled;
25+
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnSpringGrpc;
2926
import org.springframework.context.annotation.Bean;
3027
import org.springframework.grpc.server.GlobalServerInterceptor;
31-
import org.springframework.grpc.server.GrpcServerFactory;
3228
import org.springframework.grpc.server.exception.CompositeGrpcExceptionHandler;
3329
import org.springframework.grpc.server.exception.GrpcExceptionHandler;
3430
import org.springframework.grpc.server.exception.GrpcExceptionHandlerInterceptor;
@@ -42,12 +38,10 @@
4238
* @since 4.0.0
4339
*/
4440
@AutoConfiguration
45-
@ConditionalOnGrpcServerEnabled
46-
@ConditionalOnClass({ Grpc.class, GrpcServerFactory.class })
41+
@ConditionalOnSpringGrpc
42+
@ConditionalOnGrpcServerEnabled("exception-handler")
4743
@ConditionalOnBean(GrpcExceptionHandler.class)
4844
@ConditionalOnMissingBean(GrpcExceptionHandlerInterceptor.class)
49-
@ConditionalOnProperty(prefix = "spring.grpc.server.exception-handler", name = "enabled", havingValue = "true",
50-
matchIfMissing = true)
5145
public final class GrpcExceptionHandlerAutoConfiguration {
5246

5347
@GlobalServerInterceptor

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthAutoConfiguration.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3333
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
35-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3635
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
3736
import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
3837
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3938
import org.springframework.boot.context.properties.bind.BindResult;
4039
import org.springframework.boot.context.properties.bind.Bindable;
4140
import org.springframework.boot.context.properties.bind.Binder;
4241
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnGrpcServerEnabled;
42+
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnSpringGrpc;
4343
import org.springframework.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration;
4444
import org.springframework.boot.grpc.server.autoconfigure.GrpcServerProperties;
4545
import org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder;
@@ -48,7 +48,6 @@
4848
import org.springframework.context.annotation.Conditional;
4949
import org.springframework.context.annotation.Configuration;
5050
import org.springframework.core.type.AnnotatedTypeMetadata;
51-
import org.springframework.grpc.server.GrpcServerFactory;
5251
import org.springframework.scheduling.annotation.EnableScheduling;
5352

5453
/**
@@ -59,10 +58,10 @@
5958
* @since 4.0.0
6059
*/
6160
@AutoConfiguration(before = GrpcServerFactoryAutoConfiguration.class)
62-
@ConditionalOnGrpcServerEnabled
63-
@ConditionalOnClass({ GrpcServerFactory.class, HealthStatusManager.class })
61+
@ConditionalOnSpringGrpc
62+
@ConditionalOnClass(HealthStatusManager.class)
63+
@ConditionalOnGrpcServerEnabled("health")
6464
@ConditionalOnBean(BindableService.class)
65-
@ConditionalOnProperty(name = "spring.grpc.server.health.enabled", havingValue = "true", matchIfMissing = true)
6665
public final class GrpcServerHealthAutoConfiguration {
6766

6867
@Bean(destroyMethod = "enterTerminalState")
@@ -81,8 +80,7 @@ BindableService grpcHealthService(HealthStatusManager healthStatusManager) {
8180
@ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
8281
@AutoConfigureAfter(value = TaskSchedulingAutoConfiguration.class,
8382
name = "org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration")
84-
@ConditionalOnProperty(name = "spring.grpc.server.health.actuator.enabled", havingValue = "true",
85-
matchIfMissing = true)
83+
@ConditionalOnGrpcServerEnabled("health.actuator")
8684
@Conditional(OnHealthIndicatorPathsCondition.class)
8785
@EnableConfigurationProperties(GrpcServerProperties.class)
8886
@EnableScheduling

module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/security/GrpcSecurityAutoConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnGrpcNativeServer;
2727
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnGrpcServerEnabled;
2828
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnGrpcServletServer;
29+
import org.springframework.boot.grpc.server.autoconfigure.ConditionalOnSpringGrpc;
2930
import org.springframework.boot.grpc.server.autoconfigure.GrpcServerExecutorProvider;
3031
import org.springframework.boot.grpc.server.autoconfigure.exception.GrpcExceptionHandlerAutoConfiguration;
3132
import org.springframework.boot.grpc.server.autoconfigure.security.GrpcSecurityAutoConfiguration.ExceptionHandlerConfiguration;
@@ -36,7 +37,6 @@
3637
import org.springframework.context.annotation.Configuration;
3738
import org.springframework.context.annotation.Import;
3839
import org.springframework.grpc.server.GlobalServerInterceptor;
39-
import org.springframework.grpc.server.GrpcServerFactory;
4040
import org.springframework.grpc.server.exception.GrpcExceptionHandler;
4141
import org.springframework.grpc.server.security.GrpcSecurity;
4242
import org.springframework.grpc.server.security.SecurityContextServerInterceptor;
@@ -57,8 +57,9 @@
5757
*/
5858
@AutoConfiguration(before = GrpcExceptionHandlerAutoConfiguration.class,
5959
afterName = "org.springframework.boot.security.autoconfigure.servlet.SecurityAutoConfiguration")
60+
@ConditionalOnSpringGrpc
61+
@ConditionalOnClass(ObjectPostProcessor.class)
6062
@ConditionalOnGrpcServerEnabled
61-
@ConditionalOnClass({ GrpcServerFactory.class, ObjectPostProcessor.class })
6263
@Import({ ExceptionHandlerConfiguration.class, GrpcNativeSecurityConfigurerConfiguration.class,
6364
GrpcServletSecurityConfigurerConfiguration.class })
6465
public final class GrpcSecurityAutoConfiguration {

0 commit comments

Comments
 (0)