我正在努力学习一本书名为《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;
}
}
在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。
最后,我建议将实现和接口放在完全相同的包中。
我认为您需要在该类上添加@Component
注释。这样,Spring可以扫描该文件并将其注册为上下文中的bean。
看起来您使用的是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调用方法: