@AUTOWIRED:BeanCreationException

时间:2015-06-13 16:42:42

标签: java spring spring-mvc

我试图关注一本书名称Spring MVC初学者指南,而且我一直坚持创建存储库对象。我继续得到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";
    }
}

ProductRepository:

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;
    }
}     

4 个答案:

答案 0 :(得分:0)

看起来你正在使用Spring 4,但是没有使用Spring Boot,可能你是Spring的新手,所以接受我的建议,而不是使用“纯粹的”Spring,使用Spring Boot,这是一个很棒的项目,很容易与Spring合作。使用Spring Boot,您将获得免费的大量配置,您将获得许多Spring库和第三方组件的轻松依赖管理,您不需要使用XML进行配置,还有更多。目前是推荐Spring项目的推荐方法。

这是我答案的第一部分。第二部分,由于@Reimeus提到的类型,你得到了这个例外。由于您的存储库注释不在 com.packt.webstore 中,而是标记为组件扫描的基础包,因此Spring容器找不到存储库注释。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在你的XML文件中,你有这个。

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

这意味着Spring通过查看使用@Component@Repository@Service@Controller或任何其他注释标注的类来查找该包中的Bean作为一个bean的类。

您想要获取的bean是ProductRepository类型。现在,ProductRepository接口与其Implementation

位于不同的包中
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。

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

答案 3 :(得分:0)

您可以为Beans指定资格,以便Spring不会混淆哪个Bean自动连接。

InMemoryProductRepository.java

@Repository("InMemoryProductRepository")
public class InMemoryProductRepository implements ProductRepository {
    ...
}

ProductController.java

@Controller
public class ProductController {
    @Autowired
    @Qualifier("InMemoryProductRepository")
    private ProductRepository productRepository;
    ...
}