首页 > 解决方案 > 自动装配的存储库为空

问题描述

我正在尝试在名为CacheManager的类中使用存储库。此存储库应从表中获取所有行。尽管使用了@Autowired 注释,它还是为空。我在哪里失踪?谢谢。

存储库

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

MAIN - 休息控制器

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

标签: javaspring-bootrepositoryautowired

解决方案


由于您使用过private CoreController core = new CoreController();,CoreController 和 CacheManager 不是 Spring 托管的 bean,因此不会发生依赖注入。

更新

我建议你这种方法:

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

它不适合您的原因是在注入发生之前调用了构造函数。注解指示 Spring在bean 完全初始化@PostConstruct调用getAllTables方法。


推荐阅读