2014-12-13 61 views
-1

我试图找出如何,在春季启动应用程序的生命周期中,当应用程序启动时有条件地坚持一个单一的实体。通过'import.sql'或类似方法加载初始数据的正常方法在这种用例中不好,因为插入是有条件的。在启动时,我想让我的应用程序检查并查看是否存在管理员帐户和相关的管理员角色。如果两者都不存在,我希望应用程序创建它们。如果它们确实存在,我希望应用程序不做任何事情,并保留现有的实体。如果我使用import.sql方法,那么我最终会得到一个重复密钥(username = admin),否则我将覆盖现有的管理员帐户,该帐户可能由于先前的安装而将密码更改为与默认密码不同的应用程序。弹簧引导JPA初始实体持久

我一直在使用ApplicationListeners所有默认春春启动事件试过,我也得到了那些听众中的每一个空指针异常,因为JPA的存储库尚未初始化。我认为为ContextRefreshedEvent调用的监听器应该在所有bean被初始化后调用,但我想我错了。我也尝试创建一个具有@PostConstruct注释方法的bean来完成这个实体创建,但是我的JPA CrudRepositories没有被初始化。

所以我的基本问题是; “在Spring Boot应用程序启动期间,使用JPA CrudRepositories进行初始化工作的首选入口点是什么?”

回答

0

ContextRefreshedEvent通常会工作(这样你就可以与你的听众初始化排序问题)。您也可以使用SmartInitializingSingletonSmartLifecycle且autostart = true。在Spring Boot应用程序中,您也有CommandLineRunner

+0

感谢您指出_ContextRefreshedEvent_ **应**工作。这让我更深入地研究了一些事情。这个问题并不是专门针对JPA的。当实现实际运行时,任何'@ Autowired','@Inject'ed或'@ Value'到_ApplicationListener_实现中的内容都是null。 我通过不使用自动装配来避免这种情况,并且将_ApplicationContext_从_Event_传入的内容拉出来。这似乎已经成功了。 – user2856925 2014-12-16 00:06:21

+0

是的,这将工作。 Spring别无选择,只能提早实例化ApplicationListeners(因为事件发生在你感兴趣的事件之前)。所以这将解释缺失的依赖关系。 – 2014-12-16 08:25:53