SimpleStubFactory has to be more precise about supports()

This commit is contained in:
Dave Syer
2025-05-17 08:36:45 +01:00
parent c6f765e507
commit 2edb857dfc
2 changed files with 58 additions and 3 deletions

View File

@@ -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 {
}
}
}

View File

@@ -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<AbstractStub<?>> {
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