Error on integration of liquibase with Spring Boot 2

12,357

Solution 1

To add to the @SteveDonie's answer:

You can solve this error by:

  • adding <validCheckSum>7:18262c5c5851874dff0c954d60b47d59</validCheckSum> to your changeSet.
  • adding <validCheckSum>ANY</validCheckSum> to your changeSet.
  • change the id of your changeSet.
  • removing the record about this changeset in databasechangelog table (I wouldn't recomend this).
  • drop your database and then recreate it from your liquibase changeSets.

Solution 2

The error message isn't that clear if you haven't used Liquibase much.

This message:

15:44:39.081 [localhost-startStop-1] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.ValidationFailedException: Validation Failed:
 1 change sets check sum
      classpath:/db/changelog/db.changelog-master.yaml::2::marouane is now: 7:18262c5c5851874dff0c954d60b47d59

is the key error. When Liquibase applies a changeset to a database, it computes a checksum of the changeset at that exact moment and save the checksum into the database in the DATABASECHANGELOG table. If someone then alters the changeset and then attempts to use Liquibase to update the database, Liquibase will compute a different checksum for that changeset and let you know that there is a difference.

There are at least two ways to 'solve' this problem.

  1. If you know that the database can be altered (maybe it is a dev instance) and you also know that the changeset as it exists is correct, then you can just drop the database and re-create it from the changelog.

  2. If the changelog (or the file(s) that it refers to) was changed in error, the thing to do is revert the changelog to what is was before. If the changelog was changed by editing a changeset (or changing a file like sql/tables_mysql.sql), that is incorrect - once a changeset has been applied to ANY database, the correct way to make a change to whatever the changeset was altering is to create another changeset.

You didn't specify what was in the file sql/tables_mysql.sql but the contents of that file are also used in the checksum process, so when that changes, you will also see this error.

Share:
12,357
Hassine ALLAYA
Author by

Hassine ALLAYA

Updated on June 05, 2022

Comments

  • Hassine ALLAYA
    Hassine ALLAYA almost 2 years

    I am working on a Spring Boot project, and i am asked to call a sql file using liquibase.

    The sql file contains scripts for Spring Quartz tables configuration.

    Here is the POM file:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>com.sap.lsm</groupId>
       <artifactId>SAPLicencesAndSecurityManagement</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <packaging>war</packaging>
       <name>SAPLicencesAndSecurityManagement</name>
       <parent>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-parent</artifactId>
             <version>2.0.1.RELEASE</version>
             <relativePath /> <!-- lookup parent from repository -->
       </parent>
    
       <properties>
             <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
             <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
             <java.version>1.8</java.version>
             <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
       </properties>
    
       <dependencies>
    
        <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
    
                    <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
    
                    </exclusions>
             </dependency>
             <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
    
                    <exclusions>
                           <exclusion>
                                  <groupId>org.slf4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
                    </exclusions>
             </dependency>
    
             <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <scope>runtime</scope>
                    <exclusions>
                           <exclusion>
                                  <groupId>org.slf4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
                           <exclusion>
                                  <groupId>ch.qos.logback</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
                    </exclusions>
             </dependency>
    
             <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
             <version>19.0</version>
             </dependency>
    
                    <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
            </dependency> 
    
    
            <!-- javax mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
              <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
    
                    </exclusions>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
              <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
    
                    </exclusions>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
              <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
    
                    </exclusions>
        </dependency>
    
        <!-- Quartz framework -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
              <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
    
                    </exclusions>
        </dependency>
    
        <dependency>
             <groupId>org.liquibase</groupId>
             <artifactId>liquibase-core</artifactId>
            <version>3.3.5</version>
              <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
    
              </exclusions>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <type>jar</type>
            <scope>compile</scope>
              <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                           <exclusion>
                                  <groupId>org.apache.logging.log4j</groupId>
                                  <artifactId>*</artifactId>
                           </exclusion>
    
                    </exclusions>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
    
       </dependencies>
    
    
       <build>
             <finalName>SAPLicencesAndSecurityManagement</finalName>
             <plugins>
                    <plugin>
                           <groupId>com.sap.lsm</groupId>
                           <artifactId>SAPLicencesAndSecurityManagement</artifactId>
                           <version>0.0.1-SNAPSHOT</version>
                    </plugin> 
    
             </plugins>
       </build>
    

    the call of sql file is made through a yaml file, named db.changelog-master:

    [![db.changelog-master.yaml][1]][1]
    

    enter image description here

    When i run the server, the console displays an error as follow :

    15:44:36.602 [localhost-startStop-1] ERROR com.mysql.jdbc.log.StandardLogger - Mon Jun 11 15:44:36 WAT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    15:44:36.968 [HikariPool-1 connection adder] ERROR com.mysql.jdbc.log.StandardLogger - Mon Jun 11 15:44:36 WAT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    15:44:36.997 [HikariPool-1 connection adder] ERROR com.mysql.jdbc.log.StandardLogger - Mon Jun 11 15:44:36 WAT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    15:44:37.008 [HikariPool-1 connection adder] ERROR com.mysql.jdbc.log.StandardLogger - Mon Jun 11 15:44:37 WAT 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    15:44:39.081 [localhost-startStop-1] ERROR org.springframework.boot.SpringApplication - Application run failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.ValidationFailedException: Validation Failed:
     1 change sets check sum
          classpath:/db/changelog/db.changelog-master.yaml::2::marouane is now: 7:18262c5c5851874dff0c954d60b47d59
    
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    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.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:859)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:155)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:135)
    at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
     1 change sets check sum
          classpath:/db/changelog/db.changelog-master.yaml::2::marouane is now: 7:18262c5c5851874dff0c954d60b47d59
    
    at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:196)
    at liquibase.Liquibase.update(Liquibase.java:196)
    at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:415)
    at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:379)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1761)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1698)
    ... 27 common frames omitted
    
  • SteveDonie
    SteveDonie almost 6 years
    Just a note that the first 4 options above are all workarounds, and might get you past your blockage, but it is important to understand what Liquibase is doing underneath. If you add a validCheckSum attribute, you get yourself into a situation where the different databases associated with a product (DEV vs TEST vs PROD) can have different things in them. If you change the id of the changeset, same thing - you have deployed changeset with id=tableA to DEV, but then change the id to tableA-1 and deploy to DEV - now DEV has both changesets deployed. Deploy to TEST and test only has tableA-1.