创建名为“homeController”的 bean 时出错:自动装配依赖项的注入失败

Posted

技术标签:

【中文标题】创建名为“homeController”的 bean 时出错:自动装配依赖项的注入失败【英文标题】:Error creating bean with name 'homeController': Injection of autowired dependencies failed 【发布时间】:2019-06-10 19:32:55 【问题描述】:

我正在尝试在春季创建电子商务。在我的项目中包含“Hibernate”和“H2”数据库后,我得到了错误。错误如下。我非常努力,但没有找到任何解决方案。

错误:

org.springframework.beans.factory.BeanCreationException: 错误 创建名为“homeController”的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire 字段:私有 com.home.dao.ProductDao com.home.controller.homeController.productDao;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为 'productDaoImpl' 的 bean:注入 autowired 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 org.hibernate.SessionFactory com.home.dao.impl.ProductDaoImpl.sessionFactory;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建 ServletContext 中定义的名称为“sessionFactory”的 bean 资源[/WEB-INF/applicationContext.xml]:init方法的调用 失败的;嵌套异常是 org.hibernate.exception.GenericJDBCException:无法打开 JDBC DDL 执行连接

applicationContext.xml

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:~/test" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.home</value>
        </list>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean> 

home-servlet.xml

<context:component-scan base-package="com.home">
    <context:include-filter type="aspectj" expression="com.home.*" />
</context:component-scan>

<mvc:annotation-driven />

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>

</bean>

<mvc:resources mapping="/resources/**"
    location="/WEB-INF/resources/" cache-period="31556926" />


<tx:annotation-driven />

web.xml

<display-name>Archetype Created Web Application</display-name>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/home-servlet.xml,
        /WEB-INF/applicationContext.xml
    </param-value>
</context-param>

<servlet>
    <servlet-name>home</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>home</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

homeController.java

@Controller
@Configuration
public class homeController 

@Autowired
private ProductDao productDao;

@RequestMapping("/")
public String home() 
    return "views/home";



@RequestMapping("/productList")
public String getProducts(Model model) 
    List<Product> products = productDao.getAllProducts();
    model.addAttribute("products", products);

    return "views/productList";


@RequestMapping("/productList/viewProduct/productId")
public String viewProduct(@PathVariable String productId, Model model) throws IOException

    Product product = productDao.getProductById(productId);
    model.addAttribute(product);

    return "views/viewProduct";



ProductDaoImpl.java

@Repository
@Transactional
public class ProductDaoImpl implements ProductDao 

@Autowired
private SessionFactory sessionFactory;

public void addProduct(Product product) 
    Session session = sessionFactory.getCurrentSession();
    session.saveOrUpdate(product);
    session.flush();


public Product getProductById(String id) 
    Session session = sessionFactory.getCurrentSession();
    Product product = (Product) session.get(Product.class, id);
    session.flush();

    return product;


public List<Product> getAllProducts() 
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("from Product");
    List<Product> products = query.list();
    session.flush();

    return products;


public void deleteProduct (String id) 
    Session session = sessionFactory.getCurrentSession();
    session.delete(getProductById(id));
    session.flush();

Product.java 代码:

@Entity

公共类产品

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String productId;
private String productName;
private String productCategory;
private String productDescription;
private double productPrice;
private String productCondition;
private String productStatus;
private int unitInStock;
private String productManufacturer;

public String getProductId() 
    return productId;


public void setProductId(String productId) 
    this.productId = productId;


public String getProductName() 
    return productName;


public void setProductName(String productName) 
    this.productName = productName;


public String getProductCategory() 
    return productCategory;


public void setProductCategory(String productCategory) 
    this.productCategory = productCategory;


public String getProductDescription() 
    return productDescription;


public void setProductDescription(String productDescription) 
    this.productDescription = productDescription;


public double getProductPrice() 
    return productPrice;


public void setProductPrice(double productPrice) 
    this.productPrice = productPrice;


public String getProductCondition() 
    return productCondition;


public void setProductCondition(String productCondition) 
    this.productCondition = productCondition;


public String getProductStatus() 
    return productStatus;


public void setProductStatus(String productStatus) 
    this.productStatus = productStatus;


public int getUnitInStock() 
    return unitInStock;


public void setUnitInStock(int unitInStock) 
    this.unitInStock = unitInStock;


public String getProductManufacturer() 
    return productManufacturer;


public void setProductManufacturer(String productManufacturer) 
    this.productManufacturer = productManufacturer;

ProductDao.java 代码: 公共接口 ProductDao

void addProduct(Product product);

Product getProductById(String id);

List<Product> getAllProducts();

void deleteProduct(String id);

项目结构或目录图片: Project Structure or Directory at my Eclipse Oxygen IDE

【问题讨论】:

可以分享一下目录结构和ProductDao吗? #Nicholas K,请查看更新帖子,我在其中添加了 ProductDao .java 代码并检查了我的项目目录结构的图像。坦克供您发表评论。 【参考方案1】:

最后,我在使用 IntelliJ IDEA IDE 时发现了自己的问题。问题如下:

    我的问题出现在 pom.xml 文件中。在这里,我使用了 hibernate-core 最新版本 (5.4.0.Final) 依赖,它不支持 import org.hibernate.Query;包,也不支持 Query query = session.createQuery("from Product");Product product = (Product) session.get(Product.class, id); ProductDaoImpl.java 类中的代码。

    我还在 使用了最新版本的 spring-webmvcspring-corespring-orm 依赖项pom.xml 文件。因此会发生版本冲突。

解决方案:

    忘记 Eclipse 并避免它。请使用 IntelliJ IDEA。这是一个非常用户友好的 Java Spring MVC 框架的 IDE,还可以显示你做错了什么。

    创建新项目并在 pom.xml 文件中使用 hibernate-core 4.0.1.Final 版本依赖项并使用 4.2.8.RELEASE 自己的版本,spring-corespring-orm 依赖项。

      从 ProductDaoImpl.java 类中删除 import org.hibernate.Query.query; 包并放入 import org.hibernate.Query 包。

谢谢你:)

【讨论】:

【参考方案2】:

ProductDao 不是 bean..这就是原因。存储库、控制器、服务都是 bean 类型。确定这是哪种豆子.....谢谢。

【讨论】:

以上是关于创建名为“homeController”的 bean 时出错:自动装配依赖项的注入失败的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs:错误:[ng:areq] 参数“HomeController”不是函数,未定义

csharp 展出-GroupDocs.Search-UI-UserInterfaceExample - 控制器 - HomeController的-HomeController.cs

laravel 在子文件夹中找不到控制器

方法 App\Http\Controllers\HomeController::home 不存在。 [Laravel 8]

MVC4 AspNet MVC下的Ajax / 使用JQuery做相关的Ajax请求

Asp.Net Core 3.1 控制器方法未调用