From 2edb857dfc2cdb53b5bdba7a3d36ea4c3c09cd8f Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sat, 17 May 2025 08:36:45 +0100 Subject: [PATCH] SimpleStubFactory has to be more precise about supports() --- .../sample/GrpcClientApplicationTests.java | 51 ++++++++++++++++++- .../grpc/client/SimpleStubFactory.java | 10 +++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/samples/grpc-server/src/test/java/org/springframework/grpc/sample/GrpcClientApplicationTests.java b/samples/grpc-server/src/test/java/org/springframework/grpc/sample/GrpcClientApplicationTests.java index 84eea4f..e9b2d40 100644 --- a/samples/grpc-server/src/test/java/org/springframework/grpc/sample/GrpcClientApplicationTests.java +++ b/samples/grpc-server/src/test/java/org/springframework/grpc/sample/GrpcClientApplicationTests.java @@ -1,6 +1,7 @@ package org.springframework.grpc.sample; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -8,9 +9,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.ApplicationContext; +import org.springframework.grpc.client.BlockingStubFactory; import org.springframework.grpc.client.BlockingV2StubFactory; import org.springframework.grpc.client.FutureStubFactory; import org.springframework.grpc.client.ImportGrpcClients; +import org.springframework.grpc.client.SimpleStubFactory; import org.springframework.grpc.sample.proto.SimpleGrpc; import org.springframework.grpc.test.AutoConfigureInProcessTransport; @@ -83,7 +86,7 @@ public class GrpcClientApplicationTests { @Nested @SpringBootTest(properties = "spring.grpc.client.default-channel.address=0.0.0.0:9090") @AutoConfigureInProcessTransport - class BLockingV2AutowiredClients { + class BlockingV2AutowiredClients { @Autowired private ApplicationContext context; @@ -130,4 +133,50 @@ public class GrpcClientApplicationTests { } + @Nested + @SpringBootTest(properties = "spring.grpc.client.default-channel.address=0.0.0.0:9090") + @AutoConfigureInProcessTransport + class AllStubAutowiredClients { + + @Autowired + private ApplicationContext context; + + @Autowired + private SimpleGrpc.SimpleBlockingStub simpleBlockingStub; + + @Autowired + private SimpleGrpc.SimpleBlockingV2Stub simpleBlockingV2Stub; + + @Autowired + private SimpleGrpc.SimpleFutureStub simpleFutureStub; + + @Autowired + private SimpleGrpc.SimpleStub simpleStub; + + @Test + void stubsCreatedWithRightName() { + assertNotNull(context.getBeansOfType(SimpleGrpc.SimpleBlockingStub.class).get("simpleBlockingStub")); + assertNotNull(context.getBeansOfType(SimpleGrpc.SimpleBlockingV2Stub.class).get("simpleBlockingV2Stub")); + assertNotNull(context.getBeansOfType(SimpleGrpc.SimpleFutureStub.class).get("simpleFutureStub")); + assertNotNull(context.getBeansOfType(SimpleGrpc.SimpleStub.class).get("simpleStub")); + assertThat(context.getBeanNamesForType(AbstractStub.class)).hasSize(4); + + assertNotNull(simpleBlockingStub); + assertNotNull(simpleBlockingV2Stub); + assertNotNull(simpleFutureStub); + assertNotNull(simpleStub); + } + + @TestConfiguration + @ImportGrpcClients.Container(value = { + @ImportGrpcClients(basePackageClasses = SimpleGrpc.class, factory = BlockingStubFactory.class), + @ImportGrpcClients(basePackageClasses = SimpleGrpc.class, factory = BlockingV2StubFactory.class), + @ImportGrpcClients(basePackageClasses = SimpleGrpc.class, factory = FutureStubFactory.class), + @ImportGrpcClients(basePackageClasses = SimpleGrpc.class, factory = SimpleStubFactory.class), }) + static class TestConfig { + + } + + } + } diff --git a/spring-grpc-core/src/main/java/org/springframework/grpc/client/SimpleStubFactory.java b/spring-grpc-core/src/main/java/org/springframework/grpc/client/SimpleStubFactory.java index 4a2db2c..e16a421 100644 --- a/spring-grpc-core/src/main/java/org/springframework/grpc/client/SimpleStubFactory.java +++ b/spring-grpc-core/src/main/java/org/springframework/grpc/client/SimpleStubFactory.java @@ -15,6 +15,8 @@ */ package org.springframework.grpc.client; +import java.lang.reflect.Method; + import org.springframework.util.ReflectionUtils; import io.grpc.stub.AbstractStub; @@ -23,8 +25,12 @@ public class SimpleStubFactory extends AbstractStubFactory> { public static boolean supports(Class type) { Class factory = type.getEnclosingClass(); - return AbstractStubFactory.supports(AbstractStub.class, type) && factory != null - && ReflectionUtils.findMethod(factory, "newStub", (Class[]) null) != null; + return AbstractStubFactory.supports(AbstractStub.class, type) && factory != null && hasMethod(factory, type); + } + + private static boolean hasMethod(Class factory, Class type) { + Method method = ReflectionUtils.findMethod(factory, "newStub", (Class[]) null); + return method != null && method.getReturnType().isAssignableFrom(type); } @Override