找不到依赖的匹配类型的bean:Spring MVC

时间:2016-04-22 02:40:01

标签: java spring spring-mvc dependency-injection

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

  

无法自动装配字段: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时犯了错误。

你能帮忙吗?

2 个答案:

答案 0 :(得分:2)

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

“我也分别创建了一个配置类。我使用它来定义我的bean。我只使用它来指定bean并且没有在代码中的任何地方导入它。”

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

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

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

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

答案 1 :(得分:0)

我在测试班上有描述的行为。

我在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存储库刷新来进行修复,或者在更坏的情况下,需要顺序进行几次不同的存储库刷新。

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