【问题标题】:Create Testing Data at Application Startup在应用程序启动时创建测试数据
【发布时间】:2014-12-11 11:14:25
【问题描述】:

我们正在使用 Spring Boot 开发您的应用程序,目前正在通过我们的 REST API 在每次运行时创建我们的测试数据。现在我们要创建一个“Bootstrap”脚本,它应该在启动时运行,并创建我们在开发/测试等过程中需要的所有对象。

我来自 Grails,在那里你只需要一个 Bootstrap 类就可以做到这一点。

现在我修改了我们的 Application.java 类以运行另一个类的方法,它应该创建我们的对象,但我不能在其中注入我们的服务。

处理这种情况的最佳解决方案是什么?

问候 亚历山大

【问题讨论】:

    标签: java spring development-environment


    【解决方案1】:

    在我们的应用程序类中,我们现在有以下代码:

    public static void main(String[] args) {
    
        System.out.println("spring.profiles.active="+System.getProperty("spring.profiles.active"));
        ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
        System.out.println("Application Running!!!");
    
        autogenerateDatabaseTestdata(ctx);
    }
    
    private static void autogenerateDatabaseTestdata(ConfigurableApplicationContext ctx) {
        ctx.getBean(DataGenerator.class).run(ctx);
    }
    

    DataGenerator 如下所示:

    @Component
    public class DataGenerator {
    
        @Value("${spring.jpa.hibernate.ddl-auto}")
        private String schemaDllHandling;
    
        @Value("${db.autogenerate_data}")
        private Boolean isAutogenerateData;
    
        public void run(ConfigurableApplicationContext ctx) {
    
            if (isAutogenerateData == null || !isAutogenerateData || !"create".equalsIgnoreCase(schemaDllHandling)) {
                return; // Do nothing
            }
    
            System.out.println("Running Bootstrap:");
            ctx.getBean(CountryBootstrap.class).run();
            System.out.println("Bootstrap finished!");
        }
    }
    

    例如,countryBootstrap 看起来像这样:

    @Component
    public class CountryBootstrap {
    
        @Autowired
        CountryService countryService;
    
        public CountryBootstrap() {
    
        }
    
        @Autowired
        public CountryBootstrap(CountryService countryService) {
            this.countryService = countryService;
        }
    
        public void run() {
            countryService.saveCountry(new Country("Deutschland", "DE"));
        }
    }
    

    在我们的 Application.yml 中,我们有一个值指示是否应导入自动生成的数据:

    db:
        autogenerate_data: true
    

    这就是我们在应用程序启动时插入测试数据的解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2021-08-07
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2020-01-10
      相关资源
      最近更新 更多