Бин типа интерфейса не найден - PullRequest
0 голосов
/ 13 февраля 2020

Прежде всего я хотел бы сказать, что я прочитал простые вопросы и реализовал их ответы, но, похоже, ничего не работает. TL; DR Я реализую пример из книги «Весна» и вот моя проблема. Начальный класс:

package com.example.demo;
@SpringBootApplication(scanBasePackages = {"com.example.demo", "com.example.demo.dao", "com.example.demo.model", "com.example.demo.service"})
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

A Класс контроллера:

package com.example.demo.api;
@Controller
@RequestMapping("/spittles")
public class SpittleController {
    private SpittleRepository a;
    @Autowired
    public SpittleController(@Qualifier("abc") SpittleRepository a){
        this.a = a;
    }
}

Интерфейс:

package com.example.demo.dao;
@Repository("abc")
public interface SpittleRepository {
    List<Spittle> findSpittles(long max, int count);
}

Мой вывод:

Description:
Parameter 0 of constructor in com.example.demo.api.SpittleController required a bean of type 'com.example.demo.dao.SpittleRepository' that could not be found.
The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Qualifier(value="abc")

As Я уже говорил, что пример буквально скопирован из книги (я упростил его для цели вопроса). Единственная ситуация, когда эта программа не выдает ошибку, это когда я добавляю аннотацию: @ComponentScan("com.example.demo.dao") в класс DemoApplication (но работает, только если внутри dao есть один файл). Кроме того, когда я заменяю ключевое слово интерфейса на ключевое слово класса, оно также работает.

Есть ли способ заставить класс (DemoApplication) найти этот интерфейс?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020
package com.example.demo.dao;
@Repository
public interface SpittleRepository {
    List<Spittle> findSpittles(long max, int count);
}

package com.example.demo.api;
@Controller
@RequestMapping("/spittles")
public class SpittleController {
    private SpittleRepository a;
    @Autowired
    public SpittleController(@Qualifier("spittleRepository ") SpittleRepository a){
        this.a = a;
    }
}
0 голосов
/ 13 февраля 2020
  1. @ SpringBootApplication выполнит сканирование компонентов для всех пакетов в com.example.demo, поэтому не требуется явно указывать базовые пакеты.
  2. Создать репозиторий Класс и реализовать интерфейс SpittleRepository и аннотировать новый класс с @Component. Здесь требуется реализация интерфейса.
0 голосов
/ 13 февраля 2020

Аннотация @Repository должна использоваться для класса, но не для интерфейса. Просто посмотрите на это @ Хранилище

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...