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

为什么spring找不到spring cloud stream创建的@Source bean通道?

强烨
2023-03-14

我正在尝试使用Spring Cloud Stream来发布和使用Kafka消息。我一直在访问绑定通道上处理留档。我正在尝试为我的主题在通道上使用自定义名称,因此当我尝试注入它时,我有一个@Qualifier,但Spring找不到相关的bean。它说“对于每个绑定接口,Spring Cloud Stream将生成一个实现该接口的bean”,但自动连接不起作用。

我得到的错误是“com中构造函数的参数0…MessagingManager需要找不到类型为“org.springframework.messaging.MessageChannel”的bean。”

我尝试在示例中的MessagingManager构造函数之前使用@Autow的,但是在bean工厂中得到了一个类似的错误,大约有2个,所以我把它拿出来,得到了当前的错误。

我试图使用处理器可能会使事情变得复杂。

这是我的组件。我正在用spring boot运行它,并尝试用以下内容进行测试:

@Component
public class StartupTester implements ApplicationListener<ContextRefreshedEvent> {
    MessagingManager messagingManager;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        messagingManager.sendThingCreatedMessage(new ThingCreated("12345", "667788"));
    }
}

@Component
public class MessagingManager {

    private MessageChannel thingCreatedChannel;

    public MessagingManager(@Qualifier(ThingChannelProcessor.THING_CREATED) MessageChannel output) {
        thingCreatedChannel = output;
    }

    public void sendThingCreatedMessage(ThingCreated thingCreated) {  
thingCreatedChannel.send(MessageBuilder.withPayload(thingCreated).build());
    }
}


@Component
    public interface ThingsChannelProcessor extends Processor {

    String THING_REQUEST = "thing-request";
    String THING_CREATED = "thing-created";

    @Input(THING_REQUEST )
    SubscribableChannel thingsRequest();

    @Output(THING_CREATED )
    MessageChannel thingCreated();
}

我的主类上还有@EnableBinding(ThingsMessagingManager.class),该类用@SpringBootApplication注释。

共有1个答案

常雪风
2023-03-14

我无法再现你的错误。但我有几点你可以遵循:

  1. 无需使用组件为接口添加注释
  2. 似乎您的启用绑定(EnableBinding)上有一个拼写错误,您应该使用启用绑定(ThingsChannelProcessor.class)而不是消息管理器(ThingsMessagingManager)
  3. 您也不需要扩展处理器,这可能是您第一次得到2个bean的原因。如果您正在自定义频道,则无需从接收器/源/处理器下降,请查看文档中的咖啡师示例
  4. 侦听contextRefresh也不会工作,因为我们在刷新上下文后进行绑定

实际上,让我更清楚地了解一下4。我们创建了一个子上下文,因此为了确保您的上下文已完全初始化,请确保您也在启动器上实现了ApplicationContextAware,并且在发送消息之前,请检查上下文是否相同,否则,如果(this.context.equals(event.getApplicationContext()))

 类似资料:
  • 我用RESTAPI创建了一个非常基本的Spring Boot项目。我尝试将它连接到我的Angular应用程序,但它出现了一些CORS安全错误,所以我切换到了Postman。我试图用邮递员测试它,但我一直收到一个404未找到邮递员错误。为什么我不能连接到我的后端并发布到测试仪功能? 控制器 主要的 安慰 等效的 cURL 命令 邮递员

  • 因此,关于原型范围的bean,我知道spring只是在将其移交给请求的bean之前将其进行生命周期处理。如果忘记了它。而且从逻辑上我可以理解,因为它是原型,它将只被每个请求使用(是的,不是http请求)但是spring容器为什么不保留原型bean的引用来管理完整的生命周期呢?

  • 我正在使用Eclipse和Gradle。Twilio被列为依赖项。所有版本都是最新的。引用Gradle的代码将无法编译,并返回Twilio类不存在的错误消息。在线代码令人沮丧地过时了。我希望这里有人能帮忙。 我正在运行的代码非常基本:

  • 问题内容: 我正在尝试打开一个保存在源文件夹本身中的CSV文件名“ logger.csv”。 但是,这一直在给我一个“找不到文件”错误。 问题答案: 如果您现在就使用相对路径,则该文件需要存在于项目根目录中, 而不是 存在于java文件的目录中。 考虑以下层次结构: 不管用。 将 现在 的工作。(注意,该文件与src目录相邻。)

  • 问题内容: 我创建了一个整数列表,并试图返回特定值的索引。该数组是3,8,2,5,1,4,7,6并且我想返回indexOf(3),应该为0。 导入java.util。*后,我在Eclipse Java Scrapbook中尝试了以下操作: 我也尝试过: 两者都返回-1。为什么?如何使它按预期工作? 问题答案: 它不是为了使它起作用。

  • 问题内容: 为什么在使用sudo时找不到命令“ bundle”: 但是在不使用sudo时确实存在: 我问的原因是我正在关注https://github.com/gitlabhq/gitlab- recipes/tree/master/install/centos ,它指出要使用sudo。 所述添加标志…引发’bundle:命令未找到’错误,但显示“此帐户当前不可用”。 问题答案: 使用和不检查的值