我正在尝试使用 Spring Data、hibernate 和 H2 数据库制作一个简单的 Spring MVC 应用程序。但是 spring 找不到作为 bean 的存储库。
应用程序启动时出现错误:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'taskService': Unsatisfied dependency expressed through method 'setTaskRepository' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.spring.intership.repositories.TaskRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.spring.intership.repositories.TaskRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
TaskRepository.java
@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
}
TaskSerice.java
public interface TaskService {
public List<Task> getAll();
public void save(Task t);
}
TaskServiceImpl.java
public class TaskServiceImpl implements TaskService {
private TaskRepository taskRepository;
@Override
public void add(Task task) {
taskRepository.save(task);
}
@Override
public List<Task> getAll() {
LinkedList<Task> tasks = new LinkedList<>();
taskRepository.findAll().forEach(tasks::add);
return tasks;
}
@Autowired
public void setTaskRepository(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
}
BeanConfiguration.java
@Configuration
public class BeanConfiguration {
@Bean
MemoryService memoryService() {
return new MemoryServiceImpl();
}
@Bean
TimeService timeService() {
return new TimeServiceImpl();
}
@Bean
NameService nameService() {
return new NameServiceImpl();
}
@Bean
TaskService taskService() {return new TaskServiceImpl(); }
}
应用程序上下文.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:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource" id="dataSource">
<property name="driverClass" value="${db.driverClass}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.spring.intership.entities" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.driver_class">org.h2.Drive</prop>
</props>
</property>
</bean>
<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer"
init-method="start" destroy-method="stop">
<constructor-arg value="-web,-webAllowOthers,-webDaemon,-webPort,8082" />
</bean>
<jpa:repositories base-package="com.spring.intership.repositories"/>
</beans>
我的 web.xml 中有这个
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/config/application-context.xml
WEB-INF/config/application.properties
</param-value>
</context-param>
我对 MVC spring 的经验很少(在引导方面有更多经验),所以也请考虑最明显的错误;
附注我的任务.java
@Entity
@Transactional
public class Task {
private long number;
private String description;
private Date date;
@Id
@Column(name = "ID")
public long getNumber()
{
return number;
}
@Basic
@Column(name = "DESCRIPTION")
public String getDescription()
{
return description;
}
@Basic
@Column(name = "DATE")
public Date getDate()
{
return date;
}
public void setNumber(long number)
{
this.number = number;
}
public void setDate(Date date) {
this.date = date;
}
public void setDescription(String description) {
this.description = description;
}
}
最佳答案
试试这个技巧:
- 在“BeanConfiguration”类中使用“@ComponentScan”注释。请注意,您可以使用“@ComponentScan(basePackages = "com.example.package")”在存储库存在时强制扫描包。
- 您可以使用“@EnableJpaRepository(basePackages = "package.of.repositories")”扫描特定包以仅查找存储库。
- 让我们检查一下“Task”类是否带有“@Entity”注释
- 考虑将上下文转换为类并尝试使用注释而不是 xml bean 定义。
如果您选择使用@ComponentScan注释,请考虑扫描所有包的树。如果您的软件包是“com.example.repository”、“com.example.controller”、“com.example.service”,让我们扫描“com.example”,以便扫描您将添加的 future 软件包
关于java - Spring MVC 和 Spring Data Repository 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58052711/