【问题标题】:No matching bean of type [com.sachin.dao.StockDao] found for dependency没有为依赖找到类型为 [com.sachin.dao.StockDao] 的匹配 bean
【发布时间】:2016-04-22 00:37:24
【问题描述】:

当我尝试在 Spring MVC 中使用依赖注入时出现此错误。

没有为依赖找到类型为 [com.sachin.dao.StockDao] 的匹配 bean:预计至少有 1 个 bean 符合此依赖的自动装配候选条件。依赖注解:{};嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [com.sachin.dao.StockDao] 的匹配 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注释:{}

我认为我在注释中犯了一些错误。我基本上是想在我的 HomController 中注入 StockDaoImpl。

这是我的控制器文件 HomeController.java

@Controller
public class HomeController {

private final StockDao dao;

@Autowired 
public HomeController(StockDao dao){
    this.dao = dao;
}

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {        
    return "home";
}

@RequestMapping(value = "/stockgoogle/", method = RequestMethod.GET)
public @ResponseBody Stock stockGoogle(Locale locale, Model model) {    
    //StockDaoImpl si = new StockDaoImpl();
    Stock s=dao.listGoogle();
    System.out.println("reached here");
    model.addAttribute("s", s );        
    return s;
}

我创建了一个配置文件 BeanConfiguration 并使用它来创建 bean

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

我有 StockDaoImpl 来实现我的数据检索。

public class StockDaoImpl implements StockDao {    
@Override
public Stock listGoogle() {
    Connection con = null;
    Stock s = null;
    try {
        Class.forName("org.postgresql.Driver");
        con = DriverManager
           .getConnection("jdbc:postgresql://localhost:5432/webapp",
           "postgres", "sachin");             
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery( "SELECT * FROM \"public\".\"Historical\" " );            

        rs.next();
        String  name = rs.getString("Name");
        s = new Stock(name);                
        rs.close();
        stmt.close();
        con.close();             
    } catch (Exception e) {
        e.printStackTrace();
    }
    return s;
}
}

上面是实现如下接口:

public interface StockDao {
public Stock listGoogle();
}

我是不是错过了什么。还有没有我必须添加的注释。或者在别的地方。我不确定我是否正确创建了配置类。你能帮忙吗?

【问题讨论】:

  • 我会尝试将 @Repository 添加到 StockDaoImpl 类中,然后将 @Autowired 添加到 HomeController 中(并完全删除构造函数)。
  • 嗨@user2478398 谢谢你的回答。它给出的可能是未初始化错误。
  • 那是因为它被声明为final。删除此修饰符应该使您能够继续。如果您需要它是final,那么您拥有的@Autowired 构造函数就是要走的路;每当我看到@Autowired 构造函数时,我都会假设该类会有多个实例(这对于@Controller IMO 来说没有多大意义)。
  • @user2478398 好的。我试过了,还是一样的错误。我认为它无法看到 bean 定义或其他东西。

标签: spring spring-mvc dependency-injection


【解决方案1】:

您需要指向您的配置类。要从另一个 Java 配置类(例如,在您的 BeanConfiguration 类中)执行此操作,请添加:

@ComponentScan(basePackages="com.sachin")

【讨论】:

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