liquibase / liquibase-groovy-dsl

The official Groovy DSL for Liquibase
Other
83 stars 34 forks source link

Set resourceAccessor for every change (makes possible to use valueBlobFile) #22

Closed restorer closed 7 years ago

restorer commented 8 years ago

Originally, when you try to use something like:

insert tableName: 'some_table', {
    column name: 'some_data', valueBlobFile: '/path/to/file'
}

NullPointerException will be thrown at line 271 in liquibase.statement.ExecutablePreparedStatementBase:

private InputStream getResourceAsStream(String valueLobFile) throws IOException {
    String fileName = getFileName(valueLobFile);
    Set<InputStream> streams = this.resourceAccessor.getResourcesAsStream(fileName);
    ...

This is happened, because ChangeSetDelegate sets resourceAccessor only for some changes. I'm pretty sure that this was done for strong reason, but is seems to safe set resourceAccessor for every change (liquibase.change.Change requires to have setResourceAccessor(ResourceAccessor resourceAccessor) method in every delivered change).

This fix:

  1. Adds change.resourceAccessor = resourceAccessor to makeChangeFromMap;
  2. Removes change.resourceAccessor = resourceAccessor from anywhere else.
stevesaliman commented 7 years ago

Thank you for the fix, it will be included in the next release, hopefully in a day or two.

stevesaliman commented 7 years ago

Release 1.2.2 is out with a fix for this issue.

restorer commented 7 years ago

👍

stevesaliman commented 7 years ago

FYI, if you use the DSL via the Liquibase Gradle plugin, the 1.2.2 release of that plugin has a bug and should not be used. Gradle users should use version 1.2.3 of the Gradle plugin.