【问题标题】:Autowired Repository is Null [duplicate]自动装配的存储库为空 [重复]
【发布时间】:2019-04-06 19:27:05
【问题描述】:

我正在尝试在名为 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;
}

【问题讨论】:

  • 请记住,字段注入发生在构造函数完全执行之后。所以CacheManager.getAllTables() 将产生NullPointerException,因为字段fraudCacheListRepository 没有初始化。建议:由字段注入改为构造函数注入。
  • 我改了代码但问题依然存在
  • 在构造函数中:public CacheManager() { getAllTables();这将在存储库依赖之前作为依赖注入。修复您需要创建 @PostConstructor private void init() { getAllTables();如果可行,请在构造函数中将其删除,否则请投票有用,否则请告诉我。亲切的问候

标签: java spring-boot repository autowired


【解决方案1】:

由于您使用了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());
        }
    }
}

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

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2021-08-12
    • 2019-11-20
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多