【问题标题】:Could not autowire. No beans of 'MessagingPropertiesRefactor' type not found无法自动接线。找不到“MessagingPropertiesRefactor”类型的 bean
【发布时间】:2017-12-06 20:05:57
【问题描述】:

我看到了与此问题相关的其他问题,但没有一个对我的问题有真正的帮助。

我在我的测试类中定义了这两个属性。

  @Autowired  
  private MessagingProperties messagingProperties;

  @Autowired
  private MessagingPropertiesRefactor messagingPropertiesRefactor;

我正在尝试创建 MessagingProperties.java 的新版本。我基本上复制了这个类并创建了一个新文件 MessagingPropertiesRefactor.java (相同的包/目录)并粘贴了相同的代码。我更改了类定义等,但大部分都是相同的。

我收到一个 IntelliJ 设计时编译器错误,指出“无法自动装配。找不到 'MessagingPropertiesRefactor' 类型的 bean。”

然后我搜索了原始类的每一个用法,以仔细检查它是否已在某处声明,但我什么也没找到。

我是 Java(和 Spring)的“新手”。有没有人遇到过同样的问题?

【问题讨论】:

  • 重构的类有@Component注解吗?如果不是,您应该在 beans.xml 文件或 AppConfig 类文件中声明此类的 bean

标签: java spring-boot autowired spring-bean


【解决方案1】:

如果您的新类 MessagingPropertiesRefactor 没有使用 @Component 进行注释,您必须在 beans.xml 中声明它,如下所示:

<beans>
    <bean name="messagingPropertiesRefactor" class="com.package.path.MessagingPropertiesRefactor"/>
</beans>

或在您的 AppConfig.java 中像这样:

@Configuration
public class AppConfig {
    @Bean
    public MessagingPropertiesRefactor messagingPropertiesRefactor() {
        return new MessagingPropertiesRefactor();
    }
}

Source Reference

【讨论】:

    【解决方案2】:

    如果您想在测试中应用 Spring 依赖注入,您有 2 个基本选项:

    1. 如果您想在 XML 中声明 bean,请在 XML 文件中同时声明 MessagingPropertiesMessagingPropertiesRefactor,并按以下方式注释测试类:

      @RunWith(SpringRunner.class)    
      @ContextConfiguration("your.xml")
      

      bean 应该已成功自动装配。

    2. 要在 JavaConfig 中声明 bean,请执行以下操作

      2.1。像这样注释你的测试类:

      @RunWith(SpringRunner.class)    
      @ContextConfiguration
      

      2.2。在测试类中,定义上下文配置类来声明你需要的 bean:

      @Configuration    
      static class Config {
      
          @Bean
          public MessagingProperties messagingProperties() {
              // Assuming MessagingProperties has default ctor.
              return new MessagingProperties();
          }
      
          // Same for MessagingPropertiesRefactor
      }
      

      享受自动装配的 bean :)
      *配置类不必嵌套在测试类中。

    有关该主题的更多信息,请参阅 Spring 文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-ctx-management-javaconfig,第 3.5.4 章。上下文管理。

    【讨论】:

      【解决方案3】:

      确保MessagingPropertiesRefactor 已将所有注释应用于MessagingProperties 具有的类。如果有,则在您的项目的 xml 配置中查找 MessagingProperties 的 bean 定义并进行复制。

      【讨论】:

        【解决方案4】:

        所以,我找到了使它成为“bean”的“神奇”代码行。

        @EnableConfigurationProperties({MessagingProperties.class, MessagingPropertiesRefactor.class})
        public class MessagingConfiguration {
        
        @Autowired
          private MessagingProperties messagingProperties;
        
        @Autowired
          private MessagingPropertiesRefactor messagingProperties;
        

        所以,显然我需要做的就是将这个类添加到@EnableConfigurationProperties 属性。然后我可以通过使用@Autowired 属性来使用它。

        现在...为什么或如何,我不知道(就像我说的,我是 Java 的“新手”),我希望有人能详细说明这一点。

        【讨论】:

        • 您的课程MessagingPropertieMessagingPropertiesRefactor 是否被注释为@ConfigurationProperties?如果是这样,那就没有魔法了 :) 正如注释 @EnableConfigurationProperties 所说,您已启用它们,即将它们注册为 bean。
        • 但是,它似乎不是自动装配 ConfigurationProperties 的好方法。如果您正在寻找一种自动装配 bean 并像使用“普通”对象一样使用它们的技术,即明确调用它们的方法,那么最好应用答案中提出的解决方案之一。您的情况可能很具体,但从问题中不太清楚。
        猜你喜欢
        • 2021-01-17
        • 2019-08-17
        • 2021-07-02
        • 2020-08-31
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多