Spring MVC и Spring Data Repository не работают - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь создать простое приложение Spring MVC, используя Spring Data, hibernate и базу данных H2.Но 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(); }


}

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>

И у меня есть это в моей сети.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 (немного больше при загрузке), поэтому, пожалуйста, учтите и наиболее очевидные ошибки;

PS 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;
    }
}

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

попробуйте следующие советы:

  1. Используйте аннотацию "@ComponentScan" в классе "BeanConfiguration".Обратите внимание, что вы можете использовать "@ComponentScan (basePackages =" com.example.package ")" для принудительного сканирования пакета, когда ваши репозитории.
  2. Вы можете использовать "@EnableJpaRepository (basePackages =" package.of.repositories ")" для сканирования определенного пакета, чтобы найти ТОЛЬКО репозитории.
  3. Давайте проверим, помечен ли класс "Task" с помощью "@Entity "
  4. Попробуйте преобразовать свой контекст в класс и попытаться использовать аннотацию вместо определения bean-компонента xml.

Если вы решите использовать аннотацию @ComponentScan, рассмотрите возможность сканирования дерева всех пакетов.Если ваши пакеты "com.example.repository", "com.example.controller", "com.example.service", давайте просканируем "com.example", чтобы сканировать также будущие пакеты ", вы добавите

0 голосов
/ 22 сентября 2019

Я согласен с @ Luke.

Также вам следует автоматически подключить TaskRepository в TaskService.

public class TaskServiceImpl implements TaskService {

@Autowired
private TaskRepository taskRepository;
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...