【问题标题】:No matching bean of type found for dependency: Spring MVC没有找到依赖类型的匹配 bean:Spring MVC
【发布时间】:2016-08-15 11:53:22
【问题描述】:

在我的 Spring MVC 项目中尝试使用 @autowire、@configuration、@bean、@Repository 时出现此错误

无法自动装配字段:private com.sachin.dao.StockDaoImpl com.sachin.myapp.HomeController.stockDao;

嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为 [com.sachin.dao.StockDaoImpl] 的匹配 bean 的依赖项:

请告诉我我犯了什么错误。我是 Spring MVC 和依赖注入的新手。

这是我的控制器代码。我正在尝试在控制器中注入 StockDaoImpl。

@Controller
public class HomeController {

     @Autowired
    private StockDaoImpl stockDao;

    @RequestMapping(value = "/stockgoogle/", method = RequestMethod.GET)
    public @ResponseBody Stock stockGoogle(Locale locale, Model model) {    
        //StockDaoImpl stockDao = new StockDaoImpl();
        Stock s=stockDao.listGoogle();
        model.addAttribute("s", s );        
        return s;
    }

}

我的服务实现如下。我在这里使用了@Repository 注释和“stockDao”,这是我要注入的控制器中的变量名

@Repository("stockDao")
public class StockDaoImpl implements StockDao { 
    @Override
    public Stock listGoogle() {
        Stock s = null;
        try {
            ... //some code
            String  name = rs.getString("Name");
            s = new Stock(name);
            ...
         } catch (Exception e) {
         }
         return s;
    }
}

我还单独创建了一个配置类。我正在使用它来定义我的 bean。我只是用它来指定bean,并没有在代码的任何地方导入它。

@Configuration
public class BeanConfiguration {
    @Bean
    public StockDaoImpl stockDao(){
      return new StockDaoImpl();
    }
}

我在这里错过了什么吗?通过查看错误,工厂似乎看不到 @Bean 注释。除了注释@configuration 类之外,我还需要做其他任何事情吗?

我也可能以错误的方式使用注释。我可能在使用@Autowired 或@Repository 时犯了一个错误。

你能帮忙吗?

【问题讨论】:

  • 既然您使用的是 Java 配置,那么您是否指向您的配置类?如:@ComponentScan(basePackages="com.sachin.applyuc")

标签: java spring spring-mvc dependency-injection


【解决方案1】:

我认为这可能是您的问题:

“另外我还单独创建了一个配置类。我用这个来定义我的bean。我只是用这个来指定bean,并没有在代码的任何地方导入它。” p>

您需要告诉 Spring 寻找BeanConfiguration 的地方。您可以在 applicationContext.xml 文件中执行此操作(假设您有一个),如下所示:

<context:component-scan base-package="com.sachin.config" />

这假定 BeanConfiguration 位于 com.sachin.config 包中。

如果您找不到放置它的位置,共享您的 web.xml 文件可能会有所帮助。

【讨论】:

    【解决方案2】:

    我在测试类中有描述的行为。

    我在 IntelliJ 2020.1 中工作,构建了一个旧项目:

    Java 1.6
    Spring 3.0.5.RELEASE
    Maven POM 4.0.0
    Maven 3.2.5
    

    测试类开始为:

    @Test
    @ContextConfiguration(locations={ "classpath*:beans_sets/UhradyForIns.xml"})
    @TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
    @DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
    public class OdeslatJakobyAutomatickyUhraduTest extends TestBaseWithProperties {
        private static final Logger log = LoggerFactory.getLogger(OdeslatJakobyAutomatickyUhraduTest.class);
        @Autowired
        U01UhradaBaseJpaDaoForTesting dao;
    

    有时突然,在 POM 发生一些变化之后,Spring 无法自动装配 dao,从而准确地给出您的消息。 dao 被它的类和 XML 上下文描述很好地描述了,但是突然对 Spring 不可见。我尝试了很多关于 SO 描述的方法,添加注释,更改配置,但我发现这一切都过分了。我只需要随后按 4 个不同的顺序刷新 maven 存储库 4 次:

    1. mvn -e -U clean install         //In cmd line
    2. Ctrl+Shift+A Reimport maven     //in IntelliJ
    3. double round arrows for refresh //in the maven window of IntelliJ
    4. AGAIN REPEAT THE FIRST REFRESH. 
    

    在那之后,一切正常,工作正常,直到 POM 发生下一次更大的变化。

    或者...直到由于某些内部原因,Maven 或 IntelliJ 在没有您参与的情况下损坏了本地 jar 存储库。至少,我有一个案例,当时我还没有触及存储库,但又出现了 Could not autowire... 消息。但这次只有一个

    mvn -e -U clean install 
    

    够了。

    显然,在 IntelliJ 中的 maven 和/或 maven 插件中存在一些错误。 Could not autowire... 消息显示了该问题。可以通过简单的 Maven 存储库刷新来进行修复,或者在更糟糕的情况下,需要一系列不同的存储库刷新。

    我知道那个解决方案没有明显的逻辑,我们开发人员的工作越来越像魔术。而这一次,绝对不是你或我的恶习。简单地说,我们必须适应现有的错误。至少我们知道该怎么做。

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 2013-03-19
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2023-04-06
      • 2015-01-29
      • 2016-12-31
      相关资源
      最近更新 更多