Рассмотрите возможность определения bean-компонента типа 'com.test.project.repositories.TaskRepository' в вашей конфигурации. Аннотация аннотации уже существует - PullRequest
0 голосов
/ 11 июля 2019

Я создаю базовое приложение для весенней загрузки с Redis в качестве хранилища данных.Я следовал всем основным урокам Spring-Data-Redit и делал все в точности как здесь.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.Вы знаете зеленую кнопку слева.Но когда приложение запускается, это не так.

Я использую данные весенней загрузки и весенней загрузки. 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;
    }
}

Класс обслуживания, который выполняет автоматическое подключение хранилища

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

1 Ответ

0 голосов
/ 12 июля 2019

Наконец, после нескольких часов бесконечной отладки, я смог решить проблему.

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

Класс Task был объявлен абстрактным по какой-то другой причине, и из-за этого хранилище не регистрировалось в контексте.

Надеюсь, это поможет кому-то еще.

...