diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java
index 4dc3c48fe8..622e1de7de 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java
@@ -23,7 +23,9 @@ import java.util.Map;
import org.w3c.dom.Element;
+import org.springframework.aot.AotDetector;
import org.springframework.beans.factory.BeanDefinitionStoreException;
+import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
@@ -253,8 +255,13 @@ public class GatewayParser implements BeanDefinitionParser {
}
RootBeanDefinition beanDefinition = (RootBeanDefinition) gatewayProxyBuilder.getBeanDefinition();
- beanDefinition.setTargetType(
- ResolvableType.forClassWithGenerics(GatewayProxyFactoryBean.class, serviceInterface));
+ if (AotDetector.useGeneratedArtifacts()) {
+ beanDefinition.setTargetType(
+ ResolvableType.forClassWithGenerics(GatewayProxyFactoryBean.class, serviceInterface));
+ }
+ else {
+ beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, serviceInterface);
+ }
return new BeanDefinitionHolder(beanDefinition, id);
}
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/GatewayParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/GatewayParserTests.java
index 59421a5a1b..4f98ebff3c 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/config/xml/GatewayParserTests.java
+++ b/spring-integration-core/src/test/java/org/springframework/integration/config/xml/GatewayParserTests.java
@@ -36,12 +36,11 @@ import org.mockito.ArgumentMatchers;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.BeanNameAware;
+import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
-import org.springframework.core.ResolvableType;
import org.springframework.core.log.LogAccessor;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.expression.Expression;
@@ -199,17 +198,17 @@ public class GatewayParserTests {
@Test
public void testFactoryBeanObjectTypeWithServiceInterface() {
ConfigurableListableBeanFactory beanFactory = ((GenericApplicationContext) context).getBeanFactory();
- BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition("&oneWay");
- ResolvableType resolvableType = beanDefinition.getResolvableType();
- assertThat(resolvableType.getGeneric(0).getRawClass()).isEqualTo(TestService.class);
+ Object attribute =
+ beanFactory.getMergedBeanDefinition("&oneWay").getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE);
+ assertThat(attribute).isEqualTo(TestService.class);
}
@Test
public void testFactoryBeanObjectTypeWithNoServiceInterface() {
ConfigurableListableBeanFactory beanFactory = ((GenericApplicationContext) context).getBeanFactory();
- BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition("&defaultConfig");
- ResolvableType resolvableType = beanDefinition.getResolvableType();
- assertThat(resolvableType.getGeneric(0).getRawClass()).isEqualTo(RequestReplyExchanger.class);
+ Object attribute =
+ beanFactory.getMergedBeanDefinition("&defaultConfig").getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE);
+ assertThat(attribute).isEqualTo(RequestReplyExchanger.class);
}
@Test
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests-context.xml
index 1f24f17f0e..c9443f9eee 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests-context.xml
+++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests-context.xml
@@ -5,7 +5,7 @@
xsi:schemaLocation="http://www.springframework.org/schema/integration https://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
-
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests.java
index e61c0179ce..349671cadb 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests.java
+++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayXmlAndAnnotationTests.java
@@ -43,6 +43,9 @@ public class GatewayXmlAndAnnotationTests {
@Autowired
GatewayProxyFactoryBean> gatewayProxyFactoryBean;
+ @Autowired
+ AGateway stringAGateway;
+
@Test
public void test() {
assertThat(TestUtils.getPropertyValue(gatewayProxyFactoryBean, "defaultReplyTimeout", Expression.class)
@@ -52,42 +55,44 @@ public class GatewayXmlAndAnnotationTests {
"gatewayMap", Map.class);
int assertions = 0;
for (Entry entry : gatewayMap.entrySet()) {
- if (entry.getKey().getName().equals("annotationShouldntOverrideDefault")) {
- assertThat(TestUtils.getPropertyValue(entry.getValue(),
- "replyTimeout")).isEqualTo(123L);
- assertions++;
- }
- else if (entry.getKey().getName().equals("annotationShouldOverrideDefault")) {
- assertThat(TestUtils.getPropertyValue(entry.getValue(),
- "replyTimeout")).isEqualTo(234L);
- assertions++;
- }
- else if (entry.getKey().getName().equals("annotationShouldOverrideDefaultToInfinity")) {
- assertThat(TestUtils.getPropertyValue(entry.getValue(),
- "replyTimeout")).isEqualTo(-1L);
- assertions++;
- }
- else if (entry.getKey().getName().equals("explicitTimeoutShouldOverrideDefault")) {
- assertThat(TestUtils.getPropertyValue(entry.getValue(),
- "replyTimeout")).isEqualTo(456L);
- assertions++;
+ switch (entry.getKey().getName()) {
+ case "annotationShouldNotOverrideDefault" -> {
+ assertThat(TestUtils.getPropertyValue(entry.getValue(),
+ "replyTimeout")).isEqualTo(123L);
+ assertions++;
+ }
+ case "annotationShouldOverrideDefault" -> {
+ assertThat(TestUtils.getPropertyValue(entry.getValue(),
+ "replyTimeout")).isEqualTo(234L);
+ assertions++;
+ }
+ case "annotationShouldOverrideDefaultToInfinity" -> {
+ assertThat(TestUtils.getPropertyValue(entry.getValue(),
+ "replyTimeout")).isEqualTo(-1L);
+ assertions++;
+ }
+ case "explicitTimeoutShouldOverrideDefault" -> {
+ assertThat(TestUtils.getPropertyValue(entry.getValue(),
+ "replyTimeout")).isEqualTo(456L);
+ assertions++;
+ }
}
}
assertThat(assertions).isEqualTo(4);
}
- public interface AGateway {
+ public interface AGateway {
@Gateway
- String annotationShouldntOverrideDefault(String foo);
+ String annotationShouldNotOverrideDefault(T foo);
@Gateway(replyTimeout = 234)
- String annotationShouldOverrideDefault(String foo);
+ String annotationShouldOverrideDefault(T foo);
@Gateway(replyTimeout = -1)
- String annotationShouldOverrideDefaultToInfinity(String foo);
+ String annotationShouldOverrideDefaultToInfinity(T foo);
- String explicitTimeoutShouldOverrideDefault(String foo);
+ String explicitTimeoutShouldOverrideDefault(T foo);
}