当前位置: 首页 > 知识库问答 >
问题:

@自动连线:BeanCreationException

廖招
2023-03-14

我正在努力学习一本书名为《SpringMVC初学者指南》的书,我一直在努力创建存储库对象。我不断地得到一个BeanCreationException。不知道我还错过了什么。我想知道是否有人能帮我解决这个问题。

请在下面找到我的代码。谢谢

BeanCreationException

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.packt.webstore.domain.repository.ProductRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

<mvc:annotation-driven/>
<context:component-scan base-package="com.packt.webstore"/>


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

ProductCrontroller:

package com.packt.webstore.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.packt.webstore.domain.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;

@Controller
public class ProductController  {

    @Autowired
    private ProductRepository productRepository;


    @RequestMapping("/products")
    public String list(Model model){        
        model.addAttribute("products",productRepository.getAllProducts());

        return "products";
    }
}

产品存储库:

package com.packt.webstore.domain.repository;
import java.util.List;
import com.packt.webstore.domain.Product;

public interface ProductRepository {

    List<Product>getAllProducts();  

}

InMemoryProductRepository:

package com.pckt.webstore.domain.repository.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.packt.webstore.domain.Product;
import com.packt.webstore.domain.repository.ProductRepository;

@Repository
public class InMemoryProductRepository implements ProductRepository{

    private List<Product> listOfProducts=new ArrayList<Product>();

    public InMemoryProductRepository(){
        Product iphone=new Product("P1234","iPhone 6", new BigDecimal(500));

        iphone.setDescription("Apple iphone 6 smartphone with 4 inch 640 x 1136 display and 8-megapixel rear camera");
        iphone.setCategory("Smart Phone");
        iphone.setManufacturer("Apple");
        iphone.setunitInStock(1000);

        Product laptop_dell=new Product("P1235","Dell Inspiron", new BigDecimal(700));

        laptop_dell.setDescription("Dell Inspiron 14-inch Laptop (Black) with 3rd Generation Intel Core processors");
        laptop_dell.setCategory("Laptop");
        laptop_dell.setManufacturer("Dell");
        laptop_dell.setunitInStock(1000);

        Product tablet_Nexus=new Product("P1236","Nexus 7", new BigDecimal(300));

        tablet_Nexus.setDescription("Google Nexus 7 is the lightest 7 inch tablet with a QualComm Snapdragon S4 Pro Processor");
        tablet_Nexus.setCategory("Tablet");
        tablet_Nexus.setManufacturer("Google");
        tablet_Nexus.setunitInStock(1000);

        listOfProducts.add(iphone);
        listOfProducts.add(laptop_dell);
        listOfProducts.add(tablet_Nexus);
    }

    public List<Product>getAllProducts(){
        return listOfProducts;
    }
}     

共有3个答案

万德海
2023-03-14

在XML文件中,您有以下内容。

<context:component-scan base-package="com.packt.webstore"/>

这意味着Spring通过查看用@Component@Repository@Service@Controller注释的类,或者任何其他将类标记为bean的注释,来查找包中的Beans。

您要获取的bean类型为productRepository。现在,productRepository接口位于与其实现不同的包上

com.packt.webstore.domain.repository

vs.

com.packt.webstore.domain.repository.impl

由于具有@Repository的类位于后者中,因此您应该进行另一次组件扫描

<context:component-scan base-package="com.packt.webstore.domain.repository.impl"/>

这告诉Spring包中的一些类应该被视为bean。

最后,我建议将实现和接口放在完全相同的包中。

傅峰
2023-03-14

我认为您需要在该类上添加@Component注释。这样,Spring可以扫描该文件并将其注册为上下文中的bean。

凌翔宇
2023-03-14

看起来您使用的是Spring4,但没有使用SpringBoot,可能您是Spring新手,所以请接受我的建议,不要使用“纯”Spring,而是使用SpringBoot,这是一个非常棒的项目,可以大大简化Spring的工作。使用Spring Boot,您将免费获得大量配置,您将获得许多Spring库和第三方组件的轻松依赖关系管理,您不需要使用XML进行配置,以及更多。目前是启动Spring项目的推荐方式。

这是我回答的第一部分。第二部分,由于@Reimeus类型的出现,您很快就会遇到异常。由于您的存储库批注不在标记为组件扫描基本包的com.packt.webstore中,因此Spring容器找不到存储库批注。

 类似资料:
  • 问题内容: 能否请您告诉我,我如何才能很好地为Hibernate实体启用Spring自动装配? 假设我有一个实体,并希望在那里有邮件发送者: 有没有比做的更好的方法 在我的DAO中? 谢谢! 问题答案: 有可能的!(这是Spring Roo中的默认样式!) 您所需要做的就是将@Configurable批注添加到您的实体。在配置中并使用AspectJ编织激活注释。 Spring参考中有一章:7.8.

  • 我有个小问题。如果类是用@component、@service、@controller或@repository注释的,并且我想注入它的依赖项,我需要@autowired吗? 这段代码对我来说非常适用,因为它是UserDeviceService中指定的@Service注释。是因为那个吗?

  • 我有一个带有自动扫描和@Component注释的Spring项目。一些组件需要使用@Autow的注入到不同的bean中。默认情况下,它是否将是作为单例创建的相同组件bean?如果是,如何将同一组件的不同实例注入不同的bean中? 附言:我知道它接近基础,听起来很一般。只是想自己说清楚。 提前致谢

  • 我们正在使用Spring框架5和Spring Boot 2.0.0。M6,我们也在使用WebClient进行反应式编程。我们为我们的反应式Restendpoint创建了测试方法,所以我查找了一些关于如何做到这一点的例子。我发现这个或这个以及许多其他的都一样。他们只是自动绑定一个WebTestClient。所以我尝试了同样的方法: 我无法运行此操作,因为我收到错误信息: 因此,似乎不存在自动配置。我

  • 问题内容: 能否请您告诉我,我如何才能很好地为Hibernate实体启用Spring自动装配? 假设我有一个实体,并希望在那里有邮件发送者: 有没有比做的更好的方法 在我的DAO中? 谢谢! 问题答案: 有可能的!(这是Spring Roo中的默认样式!) 您所需要做的就是将@Configurable批注添加到您的实体。在配置中并使用AspectJ编织激活注释。 Spring参考中有一章:7.8.

  • 问题内容: 我在将环境连接到Spring项目时遇到问题。在这个班上 环境始终为null。 问题答案: 自动装配发生的时间比所谓的晚(由于某种原因)。 一种解决方法是实现并依赖Spring调用方法: