1

I am using the JHipster Framework and I have created an entity with the sub-generator with a Blob Image Field. In this field I am saving SVG Files. The table declaration looks like this:

    <?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd
                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <property name="now" value="now()" dbms="h2"/>
    <property name="now" value="now()" dbms="mysql"/>
    <property name="autoIncrement" value="true"/>

    <property name="clobType" value="clob" dbms="h2"/>
    <property name="clobType" value="longtext" dbms="mysql"/>

    <property name="blobType" value="blob" dbms="h2"/>
    <property name="blobType" value="longblob" dbms="mysql"/>

    <!--
        Added the entity Pattern.
    -->
    <changeSet id="20171023230151-1" author="jhipster">
        <createTable tableName="pattern">
            <column name="id" type="bigint" autoIncrement="${autoIncrement}">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(255)">
                <constraints nullable="false" />
            </column>

            <column name="description" type="varchar(255)">
                <constraints nullable="false" />
            </column>

            <column name="pattern_icon" type="${blobType}">
                <constraints nullable="true" />
            </column>

            <column name="pattern_icon_content_type" type="varchar(255)">
                <constraints nullable="true" />
            </column>


            <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here, do not remove-->
        </createTable>
        <loadData tableName="pattern"
                  encoding="UTF-8"
                  separator=";"
                  file="config/liquibase/pattern.csv">
        </loadData>

    </changeSet>
    <!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here, do not remove-->
</databaseChangeLog>

In my test environment I am using H2 as DB. In development I am using MySQL. When I try to run any of the tests which have been created from me or JHIpster I receive a org.h2.jdbc.JdbcSQLException which says, that Hexadecimal string contains non-hex character.

So I think this is a H2 problem, and I dont know how to find a work-around.Is there a way in JHipster to exclude the liquibase check respectively to skip this point in order to make the test cases work? An excerpt from the error message is here:

2017-11-30 22:42:15.504  INFO 17884 --- [           main] irpd.web.rest.ParameterResourceIntTest   : Starting ParameterResourceIntTest on Yun with PID 17884 (started by Sebnem in C:\Users\Sebnem\HSR_BA\irpd)
2017-11-30 22:42:15.510  INFO 17884 --- [           main] irpd.web.rest.ParameterResourceIntTest   : No active profile set, falling back to default profiles: default
2017-11-30 22:42:23.290  INFO 17884 --- [           main] irpd.config.MetricsConfiguration         : Initializing Metrics Log reporting
2017-11-30 22:42:28.671 ERROR 17884 --- [           main] liquibase                                : classpath:config/liquibase/master.xml: config/liquibase/changelog/20171023230151_added_entity_Pattern.xml::20171023230151-1::jhipster: Change Set config/liquibase/changelog/20171023230151_added_entity_Pattern.xml::20171023230151-1::jhipster failed.  Error: Hexadezimal Zahl enthält unerlaubtes Zeichen: "<svg xmlns=""http://www.w3.org/2000/svg"" viewBox=""0 0 71.87 71.87""><defs><style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;}.cls-1{stroke:#000;}.cls-2{stroke:#fff;}.cls-3{fill:#fff;}</style></defs><title>Element 14</title><g id=""Ebene_2"" data-name=""Ebene 2""><g id=""Ebene_27"" data-name=""Ebene 27""><circle cx=""35.93"" cy=""35.93"" r=""19.02""/><rect class=""cls-1"" x=""0.5"" y=""0.5"" width=""70.87"" height=""70.87"" rx=""14.17"" ry=""14.17""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""3.93"" ry=""12.28""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""12.28"" ry=""3.93"" transform=""matrix(0.87, -0.5, 0.5, 0.87, -13.15, 22.78)""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""3.93"" ry=""12.28"" transform=""translate(-13.15 49.09) rotate(-60)""/><circle class=""cls-3"" cx=""35.93"" cy=""35.93"" r=""1.73""/></g></g></svg>"
Hexadecimal string contains non-hex character: "<svg xmlns=""http://www.w3.org/2000/svg"" viewBox=""0 0 71.87 71.87""><defs><style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;}.cls-1{stroke:#000;}.cls-2{stroke:#fff;}.cls-3{fill:#fff;}</style></defs><title>Element 14</title><g id=""Ebene_2"" data-name=""Ebene 2""><g id=""Ebene_27"" data-name=""Ebene 27""><circle cx=""35.93"" cy=""35.93"" r=""19.02""/><rect class=""cls-1"" x=""0.5"" y=""0.5"" width=""70.87"" height=""70.87"" rx=""14.17"" ry=""14.17""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""3.93"" ry=""12.28""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""12.28"" ry=""3.93"" transform=""matrix(0.87, -0.5, 0.5, 0.87, -13.15, 22.78)""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""3.93"" ry=""12.28"" transform=""translate(-13.15 49.09) rotate(-60)""/><circle class=""cls-3"" cx=""35.93"" cy=""35.93"" r=""1.73""/></g></g></svg>"; SQL statement:
INSERT INTO PUBLIC.pattern (id, name, description, pattern_icon, pattern_icon_content_type) VALUES ('1', 'Atomic Parameter', 'Atomic Parameter Description', '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71.87 71.87"><defs><style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;}.cls-1{stroke:#000;}.cls-2{stroke:#fff;}.cls-3{fill:#fff;}</style></defs><title>Element 14</title><g id="Ebene_2" data-name="Ebene 2"><g id="Ebene_27" data-name="Ebene 27"><circle cx="35.93" cy="35.93" r="19.02"/><rect class="cls-1" x="0.5" y="0.5" width="70.87" height="70.87" rx="14.17" ry="14.17"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="3.93" ry="12.28"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="12.28" ry="3.93" transform="matrix(0.87, -0.5, 0.5, 0.87, -13.15, 22.78)"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="3.93" ry="12.28" transform="translate(-13.15 49.09) rotate(-60)"/><circle class="cls-3" cx="35.93" cy="35.93" r="1.73"/></g></g></svg>', 'image/svg+xml') -- ('1', 'Atomic Parameter', 'Atomic Parameter Description', '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71.87 71.87"><defs><style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;}.cls-1{stroke:#000;}.cls-2{stroke:#fff;}.cls-3{fill:#fff;}</style></defs><title>Element 14</title><g id="Ebene_2" data-name="Ebene 2"><g id="Ebene_27" data-name="Ebene 27"><circle cx="35.93" cy="35.93" r="19.02"/><rect class="cls-1" x="0.5" y="0.5" width="70.87" height="70.87" rx="14.17" ry="14.17"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="3.93" ry="12.28"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="12.28" ry="3.93" transform="matrix(0.87, -0.5, 0.5, 0.87, -13.15, 22.78)"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="3.93" ry="12.28" transform="translate(-13.15 49.09) rotate(-60)"/><circle class="cls-3" cx="35.93" cy="35.93" r="1.73"/></g></g></svg>', 'image/svg+xml') [90004-196] [Failed SQL: INSERT INTO PUBLIC.pattern (id, name, description, pattern_icon, pattern_icon_content_type) VALUES ('1', 'Atomic Parameter', 'Atomic Parameter Description', '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71.87 71.87"><defs><style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;}.cls-1{stroke:#000;}.cls-2{stroke:#fff;}.cls-3{fill:#fff;}</style></defs><title>Element 14</title><g id="Ebene_2" data-name="Ebene 2"><g id="Ebene_27" data-name="Ebene 27"><circle cx="35.93" cy="35.93" r="19.02"/><rect class="cls-1" x="0.5" y="0.5" width="70.87" height="70.87" rx="14.17" ry="14.17"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="3.93" ry="12.28"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="12.28" ry="3.93" transform="matrix(0.87, -0.5, 0.5, 0.87, -13.15, 22.78)"/><ellipse class="cls-2" cx="35.93" cy="35.93" rx="3.93" ry="12.28" transform="translate(-13.15 49.09) rotate(-60)"/><circle class="cls-3" cx="35.93" cy="35.93" r="1.73"/></g></g></svg>', 'image/svg+xml']
2017-11-30 22:42:28.685  WARN 17884 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [irpd/config/DatabaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20171023230151_added_entity_Pattern.xml::20171023230151-1::jhipster:
     Reason: liquibase.exception.DatabaseException: Hexadezimal Zahl enthält unerlaubtes Zeichen: "<svg xmlns=""http://www.w3.org/2000/svg"" viewBox=""0 0 71.87 71.87""><defs><style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;}.cls-1{stroke:#000;}.cls-2{stroke:#fff;}.cls-3{fill:#fff;}</style></defs><title>Element 14</title><g id=""Ebene_2"" data-name=""Ebene 2""><g id=""Ebene_27"" data-name=""Ebene 27""><circle cx=""35.93"" cy=""35.93"" r=""19.02""/><rect class=""cls-1"" x=""0.5"" y=""0.5"" width=""70.87"" height=""70.87"" rx=""14.17"" ry=""14.17""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""3.93"" ry=""12.28""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""12.28"" ry=""3.93"" transform=""matrix(0.87, -0.5, 0.5, 0.87, -13.15, 22.78)""/><ellipse class=""cls-2"" cx=""35.93"" cy=""35.93"" rx=""3.93"" ry=""12.28"" transform=""translate(-13.15 49.09) rotate(-60)""/><circle class=""cls-3"" cx=""35.93"" cy=""35.93"" r=""1.73""/></g></g></svg>"

Is is somehow possible to exclue this colum when running the JUNIT tests? Whenever I run a Junit Test, it crashed at line 4 "liquibase".

2017-12-01 11:13:11.601  INFO 51092 --- [           main] irpd.web.rest.AccountResourceIntTest     : Starting AccountResourceIntTest on Yun with PID 51092 (started by Sebnem in C:\Users\Sebnem\HSR_BA\irpd)
2017-12-01 11:13:11.608  INFO 51092 --- [           main] irpd.web.rest.AccountResourceIntTest     : No active profile set, falling back to default profiles: default
2017-12-01 11:13:20.716  INFO 51092 --- [           main] irpd.config.MetricsConfiguration         : Initializing Metrics Log reporting
2017-12-01 11:13:27.035 ERROR 51092 --- [           main] liquibase 

Any help is much appreciated.

curlie
  • 275
  • 2
  • 6
  • 17

1 Answers1

1

JHipster does not use Liquibase to insert data for your entities, it does it only for its own entities related to user management: User, Authorities, etc...

So this error is due to your change which loads data from the JHipster generated Liquibase migration 20171023230151_added_entity_Pattern.xml and the problem is very likely in the way you encoded the data in patterns.csv.

You should rather create your own migration to load your data, this way you can let JHipster manage this file and also encode your data as hexadecimal in CSV. Be aware that there is no standard way to encode binary data in SQL, so if you get it to work in H2 it does not mean it will work with your production database. See Inline BLOB / BINARY data types in SQL / JDBC

Alternatively, if you're using only SVG in XML, you could use a CLOB (long text) rather than a BLOB as Jhipster offers this option.

A simpler approach would be to write some java code in a service or in your JUnit test to read your SVG files using ClasspathResource and to call your PatternRepository to save them in database.

Gaël Marziou
  • 16,028
  • 4
  • 38
  • 49
  • Thank your for your comment. I wouldnt know how to encode the data as hexadecimal in CSV. Respectively, it wouldn't be possible to save my SVG as Hex, right? So I might try to save the SVG as a CLOB. But I still dont understand why I receive the error message, telling me that string contains non-hexidecimal chars? Why hex? – curlie Dec 01 '17 at 09:32
  • Wouldnt it be possible to exclude this column somehow when running my tests? When I run any JUnit test, it goes through the process: irpd.web.rest.AccountResourceIntTest, irpd.config.MetricsConfiguration, liquibase...see above extended edit – curlie Dec 01 '17 at 10:14
  • This is a requirement of H2 (and other databases) and no you can't exclude a column in tests. Bottom line is : don't use CSV to load binary data, it's not adapted. I edited my answer. – Gaël Marziou Dec 01 '17 at 12:04
  • Thank you for your help! – curlie Dec 05 '17 at 08:35