DBUnit: Haben Sie nicht Spalte finden ‚mycol‘ für ‚MYSCHEMA .MYTABLE‘ im Katalog ‚MYDB‘, weil Namen nicht genau übereinstimmen

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

  •  21-08-2019
  •  | 
  •  

Frage

Ich habe Probleme einen Export von meiner Datenbank Schaffung eines org.dbunit.database.QueryDataSet verwenden. Wenn ich rufe org.dbunit.dataset.xml.FlatXmlDataSet.write (IDataSet, Outputstream), erhalte ich den folgenden Stack-Trace:

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)

das in der Erforschung, sah ich, dass jemand anderes dieses Problem im Februar hatte zurück und fixierte es ein Snapshot-Build von 2.4.4 verwenden. Ich bin das regelmäßige Release-Build von 2.4.4 verwendet wird.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Dies scheint ein Fehler in dem DB2-Treiber zu sein.

Wenn Sie auf Ihre Log schauen, haben Sie einen freien Platz in dem Schemanamen. Dieses Schema Name wird von dem DB2-Treiber zurückgegeben. Ein Fix für diesen speziellen Fehler in der letzten Quelle DBUnit (Bug 2838922) implementiert.

Wie in der Bug-2838922 erwähnt, könnte dies das Problem nicht vollständig lösen.

Wenn dies der Fall ist, eine Abhilfe für das verbleibende Problem ist Ihre eigenen IMetadataHandler zu implementieren, indem den Standard ein als Beispiel genommen und die „Matches“ -Methode wie folgt zu ändern:

    ...
    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;
        }

(Sie können auch das ersten Schemanamen Problem in Ihrem eigenen IMetadataHandler lösen, indem triming die Schemanamen vor dem Gleichheitstest)

Die Seite http://dbunit.sourceforge.net/properties.html zeigt, wie zu ersetzen, eine, die Umsetzung von IMetadataHandler.

Andere Tipps

Dieses Problem tritt nur auf vorzukommen scheint dann Verwendung von DB2 und mit DBUnit festen 2.4.7 .

Alles, was Sie tun müssen, ist:

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top