我试图关注一本书名称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;
}
}
答案 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;
...
}