DBUnit: Não encontrou a coluna 'MyCol' para 'meu_esquema .MYTABLE' no catálogo MYDB 'porque os nomes não correspondem exactamente

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

  •  21-08-2019
  •  | 
  •  

Pergunta

Estou tendo problemas para criar uma exportação de meu banco de dados usando um org.dbunit.database.QueryDataSet. Quando eu chamar org.dbunit.dataset.xml.FlatXmlDataSet.write (IDataSet, OutputStream), recebo a seguinte rastreamento de pilha:

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)

Em investigar este, eu vi que alguém tinha este problema em fevereiro, e fixa-lo usando uma compilação instantâneo de 2.4.4. Eu estou usando a compilação de lançamento regular de 2.4.4.

Todas as idéias?

Foi útil?

Solução

Este parece ser um bug no driver DB2.

Se você olhar para o seu log, você tem um espaço de reposição no nome do esquema. Este nome do esquema é retornado pelo driver DB2. Uma correção como foi implementado para este erro específico na última fonte de dbunit (bug 2.838.922).

Como mencionado no bug 2838922, isso pode não resolver o problema completamente.

Se este for o caso, uma solução alternativa para o problema restante é para implementar sua própria IMetadataHandler tomando a um padrão como um exemplo e mudar o método de "partidas", como segue:

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

(você também pode resolver o primeiro problema nome do esquema em seu próprio IMetadataHandler por triming o nome do esquema antes do teste de igualdade)

A página http://dbunit.sourceforge.net/properties.html mostra como para substituir a implementação de IMetadataHandler.

Outras dicas

Esse problema parece ocorrer somente em seguida, usando DB2 e é fixo com DBUnit 2.4.7 .

Tudo que você tem a fazer é:

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top