2

org.dbunit.database.QueryDataSet を使用してデータベースのエクスポートを作成できません。org.dbunit.dataset.xml.FlatXmlDataSet.write(IDataSet, OutputStream) を呼び出すと、次のスタック トレースが表示されます。

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)

これを調査したところ、2 月に別の誰かがこの問題を抱えており、2.4.4 のスナップショット ビルドを使用して修正したことがわかりました。2.4.4 の通常のリリース ビルドを使用しています。

何か案は?

4

2 に答える 2

3

これはDB2ドライバーのバグのようです。

ログを見ると、スキーマ名に空きスペースがあります。このスキーマ名は、DB2ドライバーによって返されます。dbunitの最後のソースでこの特定のエラーに対して実装された修正(バグ2838922)。

バグ2838922で述べたように、これでは問題が完全に解決されない場合があります。

この場合、残りの問題の回避策は、デフォルトのものを例として取り上げ、「matches」メソッドを次のように変更することにより、独自のIMetadataHandlerを実装することです。

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

(同等性テストの前にスキーマ名をトリミングすることで、独自のIMetadataHandlerの最初のスキーマ名の問題を解決することもできます)

ページhttp://dbunit.sourceforge.net/properties.htmlは、IMetadataHandlerの実装を置き換える方法を示しています。

于 2009-08-21T08:08:21.773 に答える
1

この問題は、DB2 を使用している場合にのみ発生するようで、DBUnit 2.4.7 で修正されています

あなたがしなければならないことは、次のとおりです。

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
于 2015-06-08T09:02:43.150 に答える