HelloThere
HelloThere

Reputation: 71

Spring MVC and Spring Data Repository doesnt work

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

Answers (2)

Bilal Ekrem Harmanşa
Bilal Ekrem Harmanşa

Reputation: 351

I agree with @Luke.

Also you should autowire TaskRepository in TaskService.

public class TaskServiceImpl implements TaskService {

@Autowired
private TaskRepository taskRepository;
....

Upvotes: 1

Luke
Luke

Reputation: 516

try this tips:

  1. Use "@ComponentScan" annotation in "BeanConfiguration" class. Note that you can use "@ComponentScan(basePackages = "com.example.package")" to force scan of the package when your repositories are.
  2. You can use "@EnableJpaRepository(basePackages = "package.of.repositories")" to scan specific package to find ONLY repositories.
  3. Let's check if "Task" class is annoted with "@Entity"
  4. Consider to convert you context to class and try to use annotation instead of xml bean definition.

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

Related Questions