我刚刚开始学习spring-data,我在测试类中遇到了autowire存储库的问题
我创建了简单的maven结构
-src
--main
---java
----org.task.planner
-----config
-----entity
-----repository
-----service
--test
----org.task.planner
配置类(main / java / org / task / planner / config)正常工作
@Configuration
@EnableTransactionManagement
@ComponentScan("org.task.planner")
@PropertySource("classpath:app.properties")
@EnableJpaRepositories("org.task.planner.repository")
public class DataConfig {...}
存储库包中的创建了TaskRepository
public interface TaskRepository extends JpaRepository<Task, Long> {
Task findByName(String name);
}
我检查过这个bean已被实例化,可以从上下文中获取
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(DataConfig.class);
TaskRepository taskRepository = (TaskRepository) context.getBean("taskRepository");
Task byName = taskRepository.findByName("someName");
}
但是在测试类中(位于测试包中)intellij idea会发出警告“无法自动装配。找不到'TaskRepository'类型的bean”,但测试工作正常......
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DataConfig.class)
public class TaskRepositoryTest {
@Autowired
private TaskRepository taskRepository;
@Test
public void shouldCreateTaskWithoutSubTask() {
Task task = taskRepository.findByName("someName");
assertEquals("description", task.getDescription());
}
}
这个问题可以使用@Repository注释来解决,如下所示:
@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
Task findByName(String name);
}
我无法得到它,我是否错误地配置了某些内容并且应该添加注释@Repository或者idea会给出错误的警告? (据我记得,这个注释用于自定义存储库)
答案 0 :(得分:0)
您的DataConfig.class
anotate with
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:app.properties")
@ComponentScan("org.task.planner.repository")
并添加TaskRepositoryTest.class
@Transactional
解剖,您还可以使用@Repository
anotation使所有存储库类进行anotate
答案 1 :(得分:0)
您必须声明@Repository注释。但是,Custom存储库也将直接使用JpaRepository。因此,无论何时使用JpaRepository都必须使用@Repository注释进行声明。
根据此声明,可以扫描Spring,适当的组件可以通过autowire或setter wire连接它们。