springboot:scriptutils在注入bean时不会在h2中播种数据

cqoc49vn  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(294)

我有一个工作的springboot应用程序。在启动时,它执行一个sql脚本,在h2数据库中植入一些测试数据。我刚用过这个,到目前为止效果还不错。

spring:
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
  datasource:
    url: jdbc:h2:mem:portalDB;LOCK_TIMEOUT=10000;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    driver-class-name: org.h2.Driver
    username: sa
    password:
    hikari:
      pool-name: springHikariCP
      connection-timeout: 30000
      maximum-pool-size: 10
      minimum-idle: 2
    data:
        - file:../data.sql
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect

当我更改应用程序实现如下内容时:spring security hasspermission for collection
sql脚本未执行。
我发现问题是从以下代码开始的:

@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Autowired
    private PermissionEvaluator permissionEvaluator;
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler =
                new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(permissionEvaluator);
        // Pay attention here, or Spring will not be able to resolve bean
        expressionHandler.setApplicationContext(applicationContext);
        return expressionHandler;
    }
}

然后注入 PermissionEvaluator 触发大量级联依赖项的注入。链中的最后一个组件有两个依赖项。当两种药物中的任何一种被注射时 data.sql 未执行。
如果我删除这两个依赖项, data.sql 正确执行。
据我所见 ScriptUtils 不知怎么的,他没有把文件捡起来。我想知道这两件事怎么会有联系。

qvsjd97n

qvsjd97n1#

我设法通过打破bean注入中的循环依赖关系来解决这个问题,这似乎导致了这个问题。
围绕着这些线:

@Component
class MyPermissionEvaluator implement PermissionEvaluator 
{
  @Autowired
  ObjectFactory<MyPermissionEvaluator> factory;

  public MyPermissionEvaluator {
     return factory.getObject();
  }
}

相关问题