Автозагруженный репозиторий равен нулю

Я пытаюсь использовать репозиторий в классе с именем CacheManager. Этот репозиторий должен получить все строки из таблицы. Несмотря на использование аннотации @Autowired, она получает значение null. Где я скучаю? Спасибо.

РЕПОЗИТОРИЙ

@Repository
public interface FraudCacheListRepository extends CrudRepository<FraudCacheListEntity,Integer> {
    List<FraudCacheListEntity> findAll();
}

Менеджер кеша

@Component
public class CacheManager {

    private long second = 1000L;
    private long minute = second * 60;
    private long hour = minute * 60;

    private long TTL = hour;

    @Autowired
    private FraudCacheListRepository fraudCacheListRepository;

    public CacheManager() {
        getAllTables();
    }

    private void getAllTables(){
        List<FraudCacheListEntity> fraudCacheListEntities = fraudCacheListRepository.findAll();
        for (FraudCacheListEntity entity:fraudCacheListEntities) {
            System.out.println(entity.toString());
        }
    }
}

Основной контроллер

@Component
@Configurable
public class CoreController {
    public ComController com;
    @Autowired
    private CacheManager cacheManager;

    public CoreController() {
        com = new ComController();
    }
}

ГЛАВНЫЙ - Контроллер отдыха

@RestController
public class FraudRestController {
    @Autowired
    private CoreController core;
}

Имейте в виду, что внедрение поля происходит после полного выполнения конструктора. Таким образом, CacheManager.getAllTables() создаст исключение NullPointerException, поскольку поле fraudCacheListRepository не инициализировано. Предложение: перейти от внедрения поля к внедрению конструктора.

Roland Weisleder 02.11.2018 15:39

Я изменил свой код, но проблема все еще существует

Berkin Akaydın 02.11.2018 15:41

В конструкторе: public CacheManager () {getAllTables (); } это будет введено как зависимость перед зависимостью репозитория. для исправления необходимо создать @PostConstructor private void init () {getAllTables (); } и удалите его в конструкторе, если это сработает, проголосуйте за полезность, иначе дайте мне знать. с уважением

Jonathan JOhx 02.11.2018 15:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
6 094
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы использовали private CoreController core = new CoreController();, CoreController и CacheManager не являются управляемыми компонентами Spring, поэтому внедрения зависимостей не происходит.

ОБНОВИТЬ

Предлагаю вам такой подход:

@Component
public class CacheManager {

    private long second = 1000L;
    private long minute = second * 60;
    private long hour = minute * 60;

    private long TTL = hour;

    @Autowired
    private FraudCacheListRepository fraudCacheListRepository;


    @PostConstruct
    public void getAllTables(){
        List<FraudCacheListEntity> fraudCacheListEntities = fraudCacheListRepository.findAll();
        for (FraudCacheListEntity entity:fraudCacheListEntities) {
            System.out.println(entity.toString());
        }
    }
}

Причина, по которой это не работает для вас, заключается в том, что конструктор вызывается до того, как произойдет инъекция. Аннотация @PostConstruct инструктирует Spring вызвать метод getAllTablesпосле, когда компонент полностью инициализирован.

Другие вопросы по теме