Рассмотрите возможность определения bean-компонента типа «com.test.project.repositories.TaskRepository» в вашей конфигурации. Аннотация @Repository уже существует.

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

person Wasim Qamar    schedule 11.07.2019    source источник
comment
Каково имя пакета вашего класса репозитория?   -  person Ajay Kumar    schedule 11.07.2019
comment
com.test.project.repositories   -  person Wasim Qamar    schedule 11.07.2019
comment
похоже, это связано: github.com/spring-guides/ gs-accessing-data-mongodb/issues/20   -  person Wasim Qamar    schedule 11.07.2019
comment
Ваш основной класс приложения находится в пакете выше, например. основной пакет? Аннотация @SpringBootApplication сканирует только перечисленные ниже компоненты.   -  person KevKosDev    schedule 11.07.2019
comment
пакет com.test.project — это основной пакет, в котором находится @SpringBootApplication. пакет com.test.project.repositories находится там, где находится репозиторий.   -  person Wasim Qamar    schedule 12.07.2019


Ответы (1)


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

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

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

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

person Wasim Qamar    schedule 12.07.2019