java - Spring MVC 和 Spring Data Repository 不起作用

标签 java spring spring-mvc spring-data-jpa

我正在尝试使用 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;
    }
}

最佳答案

试试这个技巧:

  1. 在“BeanConfiguration”类中使用“@ComponentScan”注释。请注意,您可以使用“@ComponentScan(basePackages = "com.example.package")”在存储库存在时强制扫描包。
  2. 您可以使用“@EnableJpaRepository(basePackages = "package.of.repositories")”扫描特定包以仅查找存储库。
  3. 让我们检查一下“Task”类是否带有“@Entity”注释
  4. 考虑将上下文转换为类并尝试使用注释而不是 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/

相关文章:

java - 无法真正管理 <Float,Object> 的 map (已编辑)

java - 从子上下文引用在父上下文中创建的 Spring Singletons

java - Apereo Cas - 自定义主体 ID 发布

java - Spring - @RequestBody 阻止请求?

java - 用Spring-MVC/Java保存汉字

java - 了解 Hybris 中的 Impex 语法语句

java - Spring Server自动删除存储在应用程序文件夹中的文件

java - 使用优先级队列作为最小堆

java - 运行 selenium webdriver java 脚本时浏览器窗口落后于其他所有内容

java - 模拟随机发送警报的服务器的最佳方法