首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >液化基中的自定义属性(迁移到更新版本后)在Spring中导致失败

液化基中的自定义属性(迁移到更新版本后)在Spring中导致失败
EN

Stack Overflow用户
提问于 2019-12-17 11:16:18
回答 3查看 1.5K关注 0票数 2

在Spring maven项目中,我不得不迁移到较新版本的Liquibase核心,然后,我将得到一个ArrayIndexOutOfBoundsException。

属性定义:

代码语言:javascript
运行
复制
<property dbms="db2,derby,mysql,h2,mssql" name="autoid" value="BIGINT"/>
<property dbms="oracle" name="autoid" value="BIGINT" />
<property dbms="postgresql" name="autoid" value="SERIAL"/>

异常引发的

代码语言:javascript
运行
复制
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [com/unymira/kfirst/application/config/DatabaseManagementConfig.class]: Invocation of init method failed; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1694)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:881)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230)
    at com.unymira.kfirst.application.ApplicationLauncher.main(ApplicationLauncher.java:55)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
    at liquibase.datatype.DataTypeFactory.fromDescription(DataTypeFactory.java:251)
    at liquibase.change.core.CreateTableChange.generateStatements(CreateTableChange.java:70)
    at liquibase.change.AbstractChange.generateStatementsVolatile(AbstractChange.java:287)
    at liquibase.change.AbstractChange.warn(AbstractChange.java:358)
    at liquibase.changelog.visitor.ValidatingVisitor.visit(ValidatingVisitor.java:110)
    at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:83)
    at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:284)
    at liquibase.Liquibase.update(Liquibase.java:198)
    at liquibase.Liquibase.update(Liquibase.java:179)
    at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:366)
    at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:314)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1753)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1690)
    ... 21 common frames omitted

属性的示例使用

代码语言:javascript
运行
复制
<column autoIncrement="true" name="id" type="${autoid}">
<constraints nullable="false" primaryKey="true" primaryKeyName="${db_prefix}instancepk" />
</column>

我必须指出,这个代码是从以前的时代,没有任何问题,旧的清算基础。

有人对我做错了什么有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2020-04-16 17:19:19

这是一个不太优雅的解决方案--,而这个bug是打开的。

免责声明:--这将给您的测试增加一些开销,可能并不适合每个人。您需要手动维护最新的测试模式。

如果您有以下关于液化基迁移步骤的DB:

代码语言:javascript
运行
复制
CREATE TABLE foo(
  id text PRIMARY KEY,
  name text not null,
  hobbies text[] not null,
  locals jsonb,
  status boolean not null default false,
  date_time_updated timestamp,
  date_time_created timestamp NOT NULL
);

在SpringBoot rest资源中的测试/资源上,您可以使用以下内容创建一个testschema.sql:

代码语言:javascript
运行
复制
CREATE TABLE foo(
  id character varying(255) DEFAULT RANDOM_UUID() NOT NULL,
  name character varying(255) NOT NULL,
  hobbies ARRAY NOT NULL,
  locals json NOT NULL,
  status boolean,
  date_time_updated timestamp without time zone,
  date_time_created timestamp without time zone NOT NULL
);

他们的爱好是:

代码语言:javascript
运行
复制
<property name="json_type" value="json" dbms="postgresql"/>

我在我的实体里

代码语言:javascript
运行
复制
@Table(name = "foo")
@TypeDef(name = "json", typeClass = JsonBinaryType.class)
@TypeDef(
  name = "string-array",
  typeClass = StringArrayType.class
)
public class Foo {
...
@Type(type = "string-array")
@Column(name = "hobbies", columnDefinition = "text[]")
private String[] hobbies;

@Type(type = "json")
@Column(name = "locals", columnDefinition = "json")
private JsonNode locals;

然后您可以简单地为您编写一个@DataJpaTest,如下所示:

代码语言:javascript
运行
复制
@ExtendWith(SpringExtension.class)
@DataJpaTest
@TestPropertySource(properties = {
  "spring.jpa.hibernate.ddl-auto=validate"
})
public class TestFooRepository {

  @Autowired
  private DataSource dataSource;
  @Autowired
  private JdbcTemplate jdbcTemplate;
  @Autowired
  private EntityManager entityManager;
  @Autowired
  private FooRepository fooRepository;

  @Test
  void injectedComponentsAreNotNull() {
    assertThat(dataSource).isNotNull();
    assertThat(jdbcTemplate).isNotNull();
    assertThat(entityManager).isNotNull();
    assertThat(notificationRepository).isNotNull();
  }

  @Test
  public void testShouldSaveTheCorrectObject() throws JsonProcessingException {
    Foo expected = buildTestFoo();
    fooRepository.save(expected);
    final Optional<Foo> actual = notificationRepository.findById("<foo_id>");
    Assert.assertNotNull(actual);
    Assert.assertTrue(actual.isPresent());

    Assert.assertEquals(expected.getId(), actual.get().getId());
  }
}

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2020-05-08 19:01:58

在我的例子中,这是因为从3.6.0开始,我在MariaDB上运行时必须使用MariaDB,而在以前的版本中它通常被识别为"mysql"

由此更改引起的:https://github.com/liquibase/liquibase/commit/7fb10ed7ae599cab585d4a6a4ec891ad7b91ecf1#diff-a07fbaf7b19fd286fef2e684648d5159

票数 0
EN

Stack Overflow用户

发布于 2020-07-01 12:41:14

我在使用Open 11时也遇到了类似的问题。切换到Oracle JDK 11之后,清算库:diff运行正常。真奇怪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59373104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档