Reputation: 71
I am trying to make a simple Spring MVC application using Spring Data, hibernate and H2 database. But spring cannot find the repository as a bean.
The error when application start:
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(); }
}
application-context.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>
And i have this in my 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>
I have very little experience in MVC spring (a little more in boot) so please consider the most obvious mistakes too;
P.S. My Task.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;
}
}
Upvotes: 0
Views: 465
Reputation: 351
I agree with @Luke.
Also you should autowire TaskRepository in TaskService.
public class TaskServiceImpl implements TaskService {
@Autowired
private TaskRepository taskRepository;
....
Upvotes: 1
Reputation: 516
try this tips:
If you choose to use @ComponentScan annotation consider to scan all packages' tree. If your packages are "com.example.repository", "com.example.controller", "com.example.service" let's scan "com.example" in order to scan also future packages' you will add
Upvotes: 1