Я пытаюсь использовать репозиторий в классе с именем 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;
}
Я изменил свой код, но проблема все еще существует
В конструкторе: public CacheManager () {getAllTables (); } это будет введено как зависимость перед зависимостью репозитория. для исправления необходимо создать @PostConstructor private void init () {getAllTables (); } и удалите его в конструкторе, если это сработает, проголосуйте за полезность, иначе дайте мне знать. с уважением




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