当前位置: 首页 > 知识库问答 >
问题:

在bean上使用@PostConstruct对@sqlgroup进行

慕容玉书
2023-03-14

在使用Spring5、JUnit4.11和JDK8运行一些集成测试之前,我尝试使用@sqlgroup执行一些SQL语句。

直到今天,当我用@PostConstruct注释在我的“ConfigurationComponent”bean上添加一些初始配置时,一切都完美无缺地工作着。

当@PostConstruct方法调用依赖于数据库的bean时,测试失败,因为hiberante(因此数据库)找不到预加载的模式。

正如我所研究的,我发现@SQLGROUP中的语句将在ApplicationContext初始化后执行,因此@PostConstruct将在模式加载之前执行。

下面是我的集成测试抽象类。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application-context-test.xml" })
@Transactional
@Rollback(true)
@SqlGroup({
        @Sql(executionPhase = ExecutionPhase.BEFORE_TEST_METHOD, scripts = {
                "classpath:db_config.sql",
                "classpath:consultas/setup_esquema_0.1.sql",
                "classpath:db_datos_iniciales.sql"}),
        @Sql(executionPhase = ExecutionPhase.AFTER_TEST_METHOD, scripts = "classpath:db_teardown.sql") })
public abstract class AbstractServiceTest {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {

    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }

    @Before
    public abstract void setUp() throws Exception;

    @After
    public abstract void tearDown() throws Exception;

    public static Long randomId() {
        return new Long(Math.round(Math.random() * 1000));
    }

}

冒犯的豆子

@Configuration
public class ConfigurationComponent {

    @Autowired
    Resources resources; // resources are retrieved from database.

    @PostConstruct
    public void startUp() throws VariableGlobalInexistenteException {
        Config.environment = resources
                .getWsaaEnv();
        Config.validation = resources
                .getWsaaEnvValidation();
    }

}

我找不到使用@sqlgroup解决此问题的方法。是否有任何解决方案,一种改变生命周期并首先执行sql语句的方法?。正如您所看到的,我使用的是executionphase.before_test_method,对于这种情况没有明确的配置,比如“executionphase.before_setup”。

更新09-07-2018-使用@SQL:似乎无法实现此目的:

共有1个答案

申屠英韶
2023-03-14

我设法找到了一个变通办法。正如最新更新所述,使用@sqlgroup无法实现所需的行为。我不得不使用以下方法,使用@BeForeClass和@AfterClass:

@BeforeClass
public static void setUpBeforeClass() throws Exception {

    DriverManagerDataSource dataSource = getDataSource();
    Connection conn = dataSource.getConnection();
    ScriptUtils.executeSqlScript(conn, new ClassPathResource("db_config.sql"));
    ScriptUtils.executeSqlScript(conn, new ClassPathResource("consultas/setup_schema"));
    ScriptUtils.executeSqlScript(conn, new ClassPathResource("db_init.sql"));
    JdbcUtils.closeConnection(conn);

}

@AfterClass
public static void tearDownAfterClass() throws Exception {
    Connection conn = getDataSource().getConnection();
    ScriptUtils.executeSqlScript(conn, new ClassPathResource(
            "db_teardown.sql"));
    JdbcUtils.closeConnection(conn);
}

private static DriverManagerDataSource getDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setDriverClassName(driver);
    return dataSource;
}

所有@sqlgroup批注都已删除。这种方法非常干净,因为ScriptUtils不需要太多依赖项来运行。

 类似资料:
  • 问题内容: 再次,我看到即使没有使用绑定属性,@ PostConstruct也会每次触发。看到这个代码:- 这是JSF中最简单的bean: 您是否看到任何会导致每次触发postconstruct回调的行为?我认为JSF 2.0非常不稳定。如果每次都要触发PostConstruct @ViewScoped的作用是什么。为什么不只使用@RequestScoped?我以为我在申请中犯了一些错误。但是,当

  • 我将HiberNate与Panache一起使用,并且需要在应用程序启动时添加用户。为此,我使用注释我的bean,然后我有一个带有注释的方法。 目前,我正在使用以下代码: 据我发现,当调用此方法时,不能保证所有内容都已经设置好,我想这就是为什么它有时会失败并出现错误的原因。我已经检查过这个问题,但由于它是针对 Spring 的,因此该方法不起作用,我没有找到任何类似的东西 Quarkus。 我是否缺

  • 我正在使用Spring-3.1.0.ga开发一个服务(不是web应用程序)。我想使用hibernate-validator和Spring来验证我的服务输入。 我启用了bean验证支持: 我已经用@validated和@notnull、@size、@valid等方法参数注释了我的服务接口,它工作得很好。 我不能在接口级别注释@validate(group1.class),因为各种方法对各种组进行操作

  • 问题内容: 构造bean之后,我想使用EntityManager从数据库中检索数据。在构造函数中是不可能的,因为EntityManager是在调用构造函数之后注入的。所以我试图用@PostConstruct注释的方法来做。根据API,在完成所有注入后将调用PostConstruct方法。执行查询是可行的,但是它总是返回一个空列表。如果我在其他方法中使用相同的查询,它将返回正确的结果。有人知道,为什

  • 问题内容: 我是spring的新手,我使用https://start.spring.io/创建了一个新的spring boot项目,没有更多依赖关系,解压缩了zip文件并在IntelliJ IDEA中打开了该项目。我没有做任何进一步的配置。我现在正在尝试使用@PostConstruct方法设置bean-但是,该方法从未被spring调用。 这些是我的课程: SpringTestApplicatio

  • 经过一些实验,这似乎是使用CDI bean时的一个问题,而与我最初假设的PrimeFaces无关。 =============================================================================== 我对JSF和PrimeFaces还很陌生,因此任何指导都将非常感谢。我已经搜索了其他的帖子,并阅读了许多类似的,但没有找到解决方法。 我正试