gpt4 book ai didi

java - 考虑在配置中定义一个类型为 'com.test.project.repositories.TaskRepository' 的 bean @Repository 注释已经存在

转载 作者:行者123 更新时间:2023-12-02 03:10:51 24 4
gpt4 key购买 nike

我正在使用 Redis 作为数据存储构建一个基本的 Spring Boot 应用程序。我已经遵循了所有一般的 spring-data-rededit 教程,并且所做的一切都与这里完全相同。 https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-redis

但是当我启动应用程序时,我最终遇到了这个错误。

APPLICATION FAILED TO START
***************************

Description:

Field taskRepository in com.test.project.services.TaskService required a bean of type 'com.test.project.repositories.TaskRepository' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.test.project.repositories.TaskRepository' in your configuration.


Process finished with exit code 1

我已经寻找解决方案几个小时了。我尝试过组件扫描整个包。

IntelliJ 能够从 @EnableRedisRepositories 注释中定位 bean。你知道左边的绿色按钮。但当应用程序运行时,却没有。

我正在使用 Spring Boot 和 Spring Boot 数据 2.1.3.RELEASE

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

实际对象

@RedisHash("KnapsackTask")
@Data
@Log
public class KnapsackTask extends Task implements Serializable {

Problem problem;
Solution solution;


public KnapsackTask(Problem problem) {
this.problem = problem;
this.timestamps = new Timestamps();
this.timestamps .setSubmitted((System.currentTimeMillis() / 1000L));
}

public KnapsackTask(String taskId) {
this.taskId = taskId;
}

public KnapsackTask submit() {
log.info(problem.getCapacity().toString());
problem.getValues().forEach(p -> log.info(p.toString()));
problem.getWeights().forEach(p -> log.info(p.toString()));
log.info(this.taskId);
log.info(this.getStatus().toString());
return this;
}

public KnapsackTask process() {
return this;
}

public KnapsackTask complete() {
return this;
}
}

Autowiring 存储库的服务类

@Service
public class TaskService {

@Autowired
TaskRepository taskRepository;

public Task submitTask(Task task) {
task.submit();
task.generateNewTaskId();
task.setStatus(Task.Status.SUBMITTED);
taskRepository.save(task);
return task;
}

public Task processTask(Task task) {
task.process();
task.setStatus(Task.Status.STARTED);
taskRepository.save(task);
return task;
}

public Task completeTask(Task task) {
task.complete();
task.setStatus(Task.Status.COMPLETED);
taskRepository.save(task);
return task;
}

public Task getTask(String taskId) {
return taskRepository.findById(taskId).get();
}


public class TaskNotFound extends RuntimeException {

}
}

存储库

@Repository
public interface TaskRepository extends CrudRepository<Task, String> {

}

Redis配置文件

@Configuration
@EnableRedisRepositories(basePackages = "com.test.project.repositories")
@PropertySource("classpath:application.properties")
public class RedisConfig {

@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
return template;
}
}

最佳答案

经过几个小时的无休止的调试,我终于解决了这个问题。

@Repository
public interface TaskRepository extends CrudRepository<Task, String> {}

由于某些其他原因,任务类被声明为抽象,因此存储库未在上下文中注册。

希望它对其他人有帮助。

关于java - 考虑在配置中定义一个类型为 'com.test.project.repositories.TaskRepository' 的 bean @Repository 注释已经存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56995465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com