当前位置: 首页 > 知识库问答 >
问题:

Spring集成网关无法自动装配,找不到合格的bean

白浩荡
2023-03-14

我试图将spring批处理过程的输出发送到RabbitMQ。为了避免对Rabbitmq的硬依赖,我使用了spring集成,如spring xd中是否有API来写入消息总线?。在我决定通过Spring自动连接或实例化bean之前,我将消息推送到RabbitMQ,一切都很好。

<context:component-scan base-package="com.test.*"/> 
<channel id="input" />

<rabbit:connection-factory id="connectionFactory" />

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
    exchange="testExchange" routing-key="foo.bar" />
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:queue name="testQueue" id="timeseriesQueue" />
<rabbit:topic-exchange name="testExchange"
    id="testExchange">
    <rabbit:bindings>
        <rabbit:binding queue="testQueue" pattern="foo.*" />
    </rabbit:bindings>
</rabbit:topic-exchange>

<!-- Send message to rabbitmq -->
<gateway id="testGateway"
    service-interface="com.test.TestService"
    default-request-channel="input" />


<amqp:outbound-channel-adapter channel="input"
    amqp-template="amqpTemplate" exchange-name="testExchange"
    routing-key="foo.bar" />

testService只是方法sendMessage的接口。

spring批处理作业有一个itemWriter,它使用网关bean写入RabbitMQ

在itemWriter的write方法中,当我使用ApplicationContext实例化bean时,如下图所示,它运行良好

AbstractApplicationContext ctx =
                new ClassPathXmlApplicationContext("META-INF/spring/integration/rabbit.xml");

     TestService service = ctx.getBean("testGateway", TestService.class);
    service.sendMessage(items);
    ctx.close();

然而,当我尝试自动连线时,如下所示:

@Autowired
TestService service;

我得到以下例外:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.test.TestService com.test.TransportItemWriter.testGateway; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.test.TestService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 22 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.test.TestService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 24 more

我试着四处看看,但是网关的大多数示例(在Spring集成示例中)都是通过Application Context调用它的。我找到了http://java.dzone.com/articles/spring-integration-gateways-1,并添加了我认为丢失的任何注释,但无法让它工作。

共有3个答案

郎嘉树
2023-03-14

自动连接在功能上等同于从上下文中获取bean(除非有多个实例,在这种情况下,您需要正确的变量名或限定符),但这会给您带来不同的错误。网关是否与ItemWriter处于相同的上下文中?

`META-INF/spring/integration/rabbit.xml`

意味着它在自己的语境中。你是<代码>

我通常通过打开org的调试日志来调试这样的问题。springframework;它为bean连接发出大量日志。

另一种很好的调试技术是将应用程序上下文打印出来。getBeanFactory()。toString()。

景星华
2023-03-14

我知道这是一个老问题,但我有一个类似的问题:

我将使用一个名为MySFTPUploadGateway的类MessagingGateway接口。java(当然是一个网关)放在mydependency1中。罐子我还有一个名为ApplicationMain的SpringBoot应用程序。但是当我启动我的应用程序时,这个崩溃是因为ApplicationMain。运行时,未找到MySFTPUploadGateway的jar。类,用于将自动连接作为Bean。我尝试了组件扫描(“

读了一点,我发现https://github.com/spring-projects/spring-boot/issues/2037,很酷,我想我有@IntegrationComponentScan的解决方案(给我@jogo的线索)。但是...这种anotation仅适用于@EnableAutoConfiguration。这是关键。

因此,请将您的:

@EnableAutoConfiguration
@IntegrationComponentScan("<yourpathPackage>")

..让它继续运行!

柯苗宣
2023-03-14

我最近也在处理类似的问题。解决方案是在配置中添加新注释:

@IntegrationComponentScan(“路径到您的网关”)

 类似资料:
  • 问题内容: 我在结合JavaFX和Spring时遇到问题。我有一个简单的JavaFX应用程序,它运行良好。现在,我正在尝试向其中添加一些Spring。我在Spring教程中跟随JavaFX 2。我的代码: 是具有main的文件: : : 我的SpringFxmlLoader在教程中看起来与此类似: 我的SpringApplicationConfig: 在我的应用程序中,我具有绑定控制器: 当我运行

  • 这里排着队 但我用 使用请求/响应体系结构。它确实工作得很好,因为它提供了动态路由,手动创建tcp客户端。

  • 我的豆子。xml Java控制器 DAO类 @自动连线专用DAO数据库;

  • 主要内容:Spring 自动装配,自动装配规则,示例我们把 Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为“装配”。 Spring 的 IOC 容器虽然功能强大,但它本身不过只是一个空壳而已,它自己并不能独自完成装配工作。需要我们主动将 Bean 放进去,并告诉它 Bean 和 Bean 之间的依赖关系,它才能按照我们的要求完成装配工作。 在前面的学习中,我们都是在 XML 配置中通过 <constructor-arg>和 <

  • 我正在开发一个Spring集成应用程序,我有一个地图列表,我需要将其插入到表格中。 我使用了jdbc: Outsport-网关或适配器将记录插入到表中。 但是如何使用jdbc:出站网关从我的地图列表中插入所有记录。

  • 我对Spring集成中通道适配器和网关的差异感到困惑。正如@gary-russell在https://stackoverflow.com/a/29992267/467944中所述,通道适配器是非分布式的,而网关是双向的。如果是这种情况,为什么有amqp入站网关和amqp出站网关? 我最终要完成的是以下几点: 在控制器内接收到Http请求 将消息放在amqp队列上 消费者使用消息并将结果放入结果队列