DBUnit: N'a pas trouvé la colonne « MyCol » pour « mon_schema .MYTABLE » dans catalogue « MYDB » parce que les noms ne correspondent pas exactement

StackOverflow https://stackoverflow.com/questions/1060027

  •  21-08-2019
  •  | 
  •  

Question

Je ne parviens pas à créer une exportation de ma base de données en utilisant un org.dbunit.database.QueryDataSet. Quand j'appelle org.dbunit.dataset.xml.FlatXmlDataSet.write (IDataSet, OutputStream), je reçois la trace de la pile suivante:

java.lang.IllegalStateException: Did not find column 'MYCOL' for <schema.table> 'MYSCHEMA  .MYTABLE' in catalog 'MYDB' because names do not exactly match.
    at org.dbunit.database.ResultSetTableMetaData.scrollTo(ResultSetTableMetaData.java:297)
    at org.dbunit.database.ResultSetTableMetaData.createColumnFromDbMetaData(ResultSetTableMetaData.java:262)
    at org.dbunit.database.ResultSetTableMetaData.createMetaData(ResultSetTableMetaData.java:154)
    at org.dbunit.database.ResultSetTableMetaData.createMetaData(ResultSetTableMetaData.java:131)
    at org.dbunit.database.ResultSetTableMetaData.<init>(ResultSetTableMetaData.java:97)
    at org.dbunit.database.AbstractResultSetTable.<init>(AbstractResultSetTable.java:84)
    at org.dbunit.database.AbstractResultSetTable.<init>(AbstractResultSetTable.java:63)
    at org.dbunit.database.ForwardOnlyResultSetTable.<init>(ForwardOnlyResultSetTable.java:65)
    at org.dbunit.database.CachedResultSetTableFactory.createTable(CachedResultSetTableFactory.java:52)
    at org.dbunit.database.AbstractDatabaseConnection.createQueryTable(AbstractDatabaseConnection.java:90)
    at org.dbunit.database.AbstractDatabaseConnection.createTable(AbstractDatabaseConnection.java:115)
    at org.dbunit.database.QueryTableIterator.getTable(QueryTableIterator.java:143)
    at org.dbunit.dataset.stream.DataSetProducerAdapter.produce(DataSetProducerAdapter.java:83)
    at org.dbunit.dataset.xml.FlatXmlWriter.write(FlatXmlWriter.java:124)
    at org.dbunit.dataset.xml.FlatXmlDataSet.write(FlatXmlDataSet.java:341)

Dans la recherche, j'ai vu que quelqu'un d'autre a eu ce problème en Février, et fixe à l'aide d'une version de capture instantanée de 2.4.4. J'utilise la version release régulière de 2.4.4.

Toutes les idées?

Était-ce utile?

La solution

Cela semble être un bogue dans le pilote DB2.

Si vous regardez votre journal, vous avez un espace libre au nom de schéma. Ce nom de schéma est renvoyé par le pilote DB2. Un correctif comme cela a été mis en œuvre pour cette erreur spécifique dans la dernière source de DBUnit (bug 2838922).

Comme mentionné dans le bogue 2838922, cela pourrait ne pas résoudre le problème complètement.

Si tel est le cas, une solution pour le problème restant est de mettre en œuvre votre propre IMetadataHandler en prenant la valeur par défaut d'un titre d'exemple et changer la méthode « correspond à » comme suit:

    ...
    boolean areEqual =
            areEqualIgnoreBothNull(catalog, catalogName, caseSensitive) &&
            areEqualIgnoreNull(schema, schemaName, caseSensitive) &&
            areEqualIgnoreNull(table, tableName, caseSensitive) &&
            areEqualIgnoreNull(column, columnName, caseSensitive);

    return areEqual;


    private boolean areEqualIgnoreBothNull(String value1, String value2,
                                       boolean caseSensitive) {
            boolean areEqual = true;
            if (value1 != null && value2 != null) {
                if (value1.equals("") && value2.equals("")) {
                    if (caseSensitive) {
                        areEqual = value1.equals(value2);
                    } else {
                        areEqual = value1.equalsIgnoreCase(value2);
                    }
                }
            }
            return areEqual;
        }

(vous pouvez également résoudre le premier problème de nom de schéma dans votre propre IMetadataHandler par triming le nom du schéma avant le test d'égalité)

La page http://dbunit.sourceforge.net/properties.html montre comment pour remplacer une mise en œuvre de la IMetadataHandler.

Autres conseils

Ce problème semble se produire alors seulement en utilisant DB2 et est fixe avec DBUnit 2.4.7 .

Tout ce que vous avez à faire est:

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top