Skip to content

Commit b7112fe

Browse files
committed
Move the filter lookup into the autoconfiguration.
Signed-off-by: Chris Bono <[email protected]>
1 parent b47259d commit b7112fe

File tree

4 files changed

+82
-52
lines changed

4 files changed

+82
-52
lines changed

spring-grpc-core/src/main/java/org/springframework/grpc/server/service/DefaultGrpcServiceConfigurer.java

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@
2020
import java.util.List;
2121

2222
import org.springframework.beans.factory.InitializingBean;
23-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
24-
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
2523
import org.springframework.context.ApplicationContext;
26-
import org.springframework.core.log.LogAccessor;
2724
import org.springframework.grpc.internal.ApplicationContextBeanLookupUtils;
2825
import org.springframework.grpc.server.GlobalServerInterceptor;
2926
import org.springframework.grpc.server.GrpcServerFactory;
@@ -43,22 +40,21 @@
4340
*/
4441
public class DefaultGrpcServiceConfigurer implements GrpcServiceConfigurer, InitializingBean {
4542

46-
private final LogAccessor log = new LogAccessor(getClass());
47-
4843
private final ApplicationContext applicationContext;
4944

5045
private List<ServerInterceptor> globalInterceptors;
5146

5247
private ServerInterceptorFilter interceptorFilter;
5348

54-
public DefaultGrpcServiceConfigurer(ApplicationContext applicationContext) {
49+
public DefaultGrpcServiceConfigurer(ApplicationContext applicationContext,
50+
@Nullable ServerInterceptorFilter interceptorFilter) {
5551
this.applicationContext = applicationContext;
52+
this.interceptorFilter = interceptorFilter;
5653
}
5754

5855
@Override
5956
public void afterPropertiesSet() {
6057
this.globalInterceptors = findGlobalInterceptors();
61-
this.interceptorFilter = findInterceptorFilter();
6258
}
6359

6460
@Override
@@ -73,22 +69,6 @@ private List<ServerInterceptor> findGlobalInterceptors() {
7369
ServerInterceptor.class, GlobalServerInterceptor.class);
7470
}
7571

76-
private ServerInterceptorFilter findInterceptorFilter() {
77-
try {
78-
return this.applicationContext.getBean(ServerInterceptorFilter.class);
79-
}
80-
catch (NoUniqueBeanDefinitionException noUniqueBeanEx) {
81-
this.log.warn(noUniqueBeanEx,
82-
() -> "No unique ServerInterceptorFilter bean found. Consider defining a single bean or marking one as @Primary");
83-
return null;
84-
}
85-
catch (NoSuchBeanDefinitionException ignored) {
86-
this.log.debug(
87-
() -> "No ServerInterceptorFilter bean found - filtering will not be applied to server interceptors.");
88-
return null;
89-
}
90-
}
91-
9272
private ServerServiceDefinition bindInterceptors(BindableService bindableService,
9373
@Nullable GrpcServiceInfo serviceInfo, GrpcServerFactory serverFactory) {
9474
var serviceDef = bindableService.bindService();

spring-grpc-core/src/test/java/org/springframework/grpc/server/service/DefaultGrpcServiceConfigurerTests.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -305,16 +305,12 @@ class WithInterceptorFilters {
305305
@Test
306306
void whenFilterIncludesOneInterceptorThenItIsAddedToServiceInfo() {
307307
var serviceInfo = GrpcServiceInfo.withInterceptors(List.of(TestServerInterceptorA.class));
308-
309308
var factory = mock(GrpcServerFactory.class);
310-
311309
ServerInterceptorFilter interceptorFilter = (interceptor, __,
312310
serverFactory) -> (interceptor == GlobalServerInterceptorsConfig.GLOBAL_INTERCEPTOR_BAR
313311
&& serverFactory == factory);
314-
315312
var expectedInterceptors = List.of(GlobalServerInterceptorsConfig.GLOBAL_INTERCEPTOR_BAR,
316313
ServiceSpecificInterceptorsConfig.SVC_INTERCEPTOR_A);
317-
318314
customizeContextAndRunServiceConfigurerWithServiceInfo((contextRunner) -> contextRunner
319315
.withBean(ServerInterceptorFilter.class, () -> interceptorFilter)
320316
.withUserConfiguration(GlobalServerInterceptorsConfig.class, ServiceSpecificInterceptorsConfig.class),
@@ -324,18 +320,14 @@ void whenFilterIncludesOneInterceptorThenItIsAddedToServiceInfo() {
324320
@Test
325321
void whenFilterIncludesAllInterceptorsThenTheyAreAllAddedToServiceInfo() {
326322
var serviceInfo = GrpcServiceInfo.withInterceptors(List.of(TestServerInterceptorA.class));
327-
328323
var factory = mock(GrpcServerFactory.class);
329-
330324
ServerInterceptorFilter interceptorFilter = (interceptor, __,
331325
serverFactory) -> ((interceptor == GlobalServerInterceptorsConfig.GLOBAL_INTERCEPTOR_BAR
332326
|| interceptor == GlobalServerInterceptorsConfig.GLOBAL_INTERCEPTOR_FOO)
333327
&& serverFactory == factory);
334-
335328
var expectedInterceptors = List.of(GlobalServerInterceptorsConfig.GLOBAL_INTERCEPTOR_BAR,
336329
GlobalServerInterceptorsConfig.GLOBAL_INTERCEPTOR_FOO,
337330
ServiceSpecificInterceptorsConfig.SVC_INTERCEPTOR_A);
338-
339331
customizeContextAndRunServiceConfigurerWithServiceInfo((contextRunner) -> contextRunner
340332
.withBean(ServerInterceptorFilter.class, () -> interceptorFilter)
341333
.withUserConfiguration(GlobalServerInterceptorsConfig.class, ServiceSpecificInterceptorsConfig.class),
@@ -356,8 +348,9 @@ interface TestServerInterceptorB extends ServerInterceptor {
356348
static class ServiceConfigurerConfig {
357349

358350
@Bean
359-
GrpcServiceConfigurer grpcServiceConfigurer(ApplicationContext applicationContext) {
360-
return new DefaultGrpcServiceConfigurer(applicationContext);
351+
GrpcServiceConfigurer grpcServiceConfigurer(ApplicationContext applicationContext,
352+
@Nullable ServerInterceptorFilter interceptorFilter) {
353+
return new DefaultGrpcServiceConfigurer(applicationContext, interceptorFilter);
361354
}
362355

363356
}

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.grpc.autoconfigure.server;
1717

18+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
19+
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
1820
import org.springframework.beans.factory.ObjectProvider;
1921
import org.springframework.boot.autoconfigure.AutoConfiguration;
2022
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -33,6 +35,7 @@
3335
import org.springframework.grpc.server.service.DefaultGrpcServiceDiscoverer;
3436
import org.springframework.grpc.server.service.GrpcServiceConfigurer;
3537
import org.springframework.grpc.server.service.GrpcServiceDiscoverer;
38+
import org.springframework.grpc.server.service.ServerInterceptorFilter;
3639

3740
import io.grpc.BindableService;
3841
import io.grpc.CompressorRegistry;
@@ -69,8 +72,24 @@ ServerBuilderCustomizers serverBuilderCustomizers(ObjectProvider<ServerBuilderCu
6972

7073
@ConditionalOnMissingBean(GrpcServiceConfigurer.class)
7174
@Bean
72-
DefaultGrpcServiceConfigurer grpcServiceConfigurer(ApplicationContext applicationContext) {
73-
return new DefaultGrpcServiceConfigurer(applicationContext);
75+
DefaultGrpcServiceConfigurer grpcServiceConfigurer(ApplicationContext applicationContext,
76+
ObjectProvider<ServerInterceptorFilter> serverInterceptorFiltersProvider) {
77+
return new DefaultGrpcServiceConfigurer(applicationContext,
78+
getRequiredUniqueOrNull(serverInterceptorFiltersProvider));
79+
}
80+
81+
private <T> T getRequiredUniqueOrNull(ObjectProvider<T> objectProvider) {
82+
T interceptorFilter;
83+
try {
84+
interceptorFilter = objectProvider.getObject();
85+
}
86+
catch (NoUniqueBeanDefinitionException ex) {
87+
throw ex;
88+
}
89+
catch (NoSuchBeanDefinitionException nex) {
90+
interceptorFilter = null;
91+
}
92+
return interceptorFilter;
7493
}
7594

7695
@ConditionalOnMissingBean(GrpcServiceDiscoverer.class)

spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerAutoConfigurationTests.java

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import org.assertj.core.api.InstanceOfAssertFactories;
3131
import org.junit.jupiter.api.BeforeEach;
32+
import org.junit.jupiter.api.Nested;
3233
import org.junit.jupiter.api.Test;
3334
import org.mockito.InOrder;
3435
import org.mockito.MockedStatic;
@@ -54,6 +55,7 @@
5455
import org.springframework.grpc.server.service.DefaultGrpcServiceDiscoverer;
5556
import org.springframework.grpc.server.service.GrpcServiceConfigurer;
5657
import org.springframework.grpc.server.service.GrpcServiceDiscoverer;
58+
import org.springframework.grpc.server.service.ServerInterceptorFilter;
5759

5860
import io.grpc.BindableService;
5961
import io.grpc.Grpc;
@@ -152,23 +154,6 @@ void grpcServiceDiscovererAutoConfiguredAsExpected() {
152154
.isInstanceOf(DefaultGrpcServiceDiscoverer.class));
153155
}
154156

155-
@Test
156-
void whenHasUserDefinedGrpcServiceConfigurerDoesNotAutoConfigureBean() {
157-
GrpcServiceConfigurer customGrpcServiceConfigurer = mock(GrpcServiceConfigurer.class);
158-
this.contextRunner()
159-
.withBean("customGrpcServiceConfigurer", GrpcServiceConfigurer.class, () -> customGrpcServiceConfigurer)
160-
.run((context) -> assertThat(context).getBean(GrpcServiceConfigurer.class)
161-
.isSameAs(customGrpcServiceConfigurer));
162-
}
163-
164-
@Test
165-
void grpcServiceConfigurerAutoConfiguredAsExpected() {
166-
this.contextRunnerWithLifecyle()
167-
.withPropertyValues("spring.grpc.server.port=0")
168-
.run((context) -> assertThat(context).getBean(GrpcServiceConfigurer.class)
169-
.isInstanceOf(DefaultGrpcServiceConfigurer.class));
170-
}
171-
172157
@Test
173158
void whenHasUserDefinedServerBuilderCustomizersDoesNotAutoConfigureBean() {
174159
ServerBuilderCustomizers customCustomizers = mock(ServerBuilderCustomizers.class);
@@ -407,6 +392,59 @@ void nettyServerFactoryAutoConfiguredWithSsl() {
407392
NettyGrpcServerFactory.class, "myhost:6160", "nettyGrpcServerLifecycle");
408393
}
409394

395+
@Nested
396+
class WithGrpcServiceConfigurerAutoConfig {
397+
398+
@Test
399+
void whenHasUserDefinedBeanDoesNotAutoConfigureBean() {
400+
GrpcServiceConfigurer customGrpcServiceConfigurer = mock(GrpcServiceConfigurer.class);
401+
GrpcServerAutoConfigurationTests.this.contextRunner()
402+
.withBean("customGrpcServiceConfigurer", GrpcServiceConfigurer.class, () -> customGrpcServiceConfigurer)
403+
.run((context) -> assertThat(context).getBean(GrpcServiceConfigurer.class)
404+
.isSameAs(customGrpcServiceConfigurer));
405+
}
406+
407+
@Test
408+
void configurerAutoConfiguredAsExpected() {
409+
GrpcServerAutoConfigurationTests.this.contextRunnerWithLifecyle()
410+
.withPropertyValues("spring.grpc.server.port=0")
411+
.run((context) -> assertThat(context).getBean(GrpcServiceConfigurer.class)
412+
.isInstanceOf(DefaultGrpcServiceConfigurer.class));
413+
}
414+
415+
@Test
416+
void whenNoServerInterceptorFilterThenConfigurerUsesNoFilter() {
417+
GrpcServerAutoConfigurationTests.this.contextRunnerWithLifecyle()
418+
.withPropertyValues("spring.grpc.server.port=0")
419+
.run((context) -> assertThat(context).getBean(GrpcServiceConfigurer.class)
420+
.extracting("interceptorFilter")
421+
.isNull());
422+
}
423+
424+
@Test
425+
void whenUniqueServerInterceptorFilterThenConfigurerUsesFilter() {
426+
ServerInterceptorFilter interceptorFilter = mock();
427+
GrpcServerAutoConfigurationTests.this.contextRunnerWithLifecyle()
428+
.withPropertyValues("spring.grpc.server.port=0")
429+
.withBean(ServerInterceptorFilter.class, () -> interceptorFilter)
430+
.run((context) -> assertThat(context).getBean(GrpcServiceConfigurer.class)
431+
.extracting("interceptorFilter")
432+
.isSameAs(interceptorFilter));
433+
}
434+
435+
@Test
436+
void whenMultipleServerInterceptorFiltersThenThrowsException() {
437+
GrpcServerAutoConfigurationTests.this.contextRunnerWithLifecyle()
438+
.withPropertyValues("spring.grpc.server.port=0")
439+
.withBean("filter1", ServerInterceptorFilter.class, Mockito::mock)
440+
.withBean("filter2", ServerInterceptorFilter.class, Mockito::mock)
441+
.run((context) -> assertThat(context).hasFailed()
442+
.getFailure()
443+
.hasMessageContaining("expected single matching bean but found 2: filter1,filter2"));
444+
}
445+
446+
}
447+
410448
@Configuration(proxyBeanMethods = false)
411449
static class ServerBuilderCustomizersConfig {
412450

0 commit comments

Comments
 (0)