【问题标题】:DBUnit PostgresqlDataTypeFactory does not recognizes enum listDBUnit PostgresqlDataTypeFactory 不识别枚举列表
【发布时间】:2016-10-25 16:18:36
【问题描述】:

我正在使用 DBUnit 进行集成测试,在执行测试代码之前我遇到了这个错误:

badges.track_types data type (2003, '_text') not recognized and will be ignored. See FAQ for more information.

org.dbunit.dataset.NoSuchColumnException: badges.TRACK_TYPES -  (Non-uppercase input column: track_types) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.

被忽略的列是枚举列表。 在数据集中它是这样写的:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  // More info ...
  <badges name="30&apos;000" description="30k a day" image_name="30000.png" threshold_val="30000.00000000" has_many="true" id="45" track_types="{TRACK_GENERIC}" "/> 
</dataset> 

我查看了 DBUnit FAQ 并看到了 this issue ,说我必须重写 isEnumType() 方法以支持我的枚举是 Postgresql,所以我这样做了:

/**
 * Override method to set custom properties/features
 */
protected void setUpDatabaseConfig(DatabaseConfig config) {

    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new PostgresqlDataTypeFactory(){
        public boolean isEnumType(String sqlTypeName) {
            if(sqlTypeName.equalsIgnoreCase("track_types")){
                return true;
            }
            return false;
        }
    });
    config.setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new DefaultMetadataHandler());
}

但我仍然得到同样的错误,我不知道为什么。也许我没有很好地覆盖该方法?也许这甚至不是我问题的原因? 如果您需要任何其他代码,请询问,谢谢!

【问题讨论】:

  • 您的数据集badges 是否包含TRACK_TYPES 列?
  • 你能把你的源代码发给我吗?我会尝试深入研究它。
  • @KevinWallis 我刚刚更新了问题,以便您可以看到数据集行。是的,它包含该列,但由于错误状态而被忽略。
  • @IvanUrsul 你到底需要什么?那是涉及问题的源代码,我分享它没有问题,但是请让我知道您需要的部分,这样我就不会把问题搞得太大了。非常感谢!

标签: java postgresql enums integration-testing dbunit


【解决方案1】:

尝试用它的值来持久化枚举

enum.values();

它返回一个数组而不是你保存这个元素

【讨论】:

  • 我应该在哪里保存枚举?在 setUpDatabaseConfig 方法中?
  • 尝试使用EntityManager 它有一个persist(obj) 方法
【解决方案2】:

嗯...我无法完全解决这个问题,但设法通过解决方法解决了它。

这个错误是因为@DatabaseSetup 注释。如果我在不使用它的情况下执行此过程,它仍然会引发“无法识别列”错误,因为它无法识别 postgres 数组(这是我拥有的根本原因),但我可以通过创建一个扩展的新 DataTypeFactory 来解决它从默认的:

public class PsqlArrayDataTypeFactory extends DefaultDataTypeFactory {
        public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException {
            if (sqlType == Types.ARRAY)
            {
                return DataType.VARCHAR;
            }

            return super.createDataType(sqlType, sqlTypeName);
        }
    }

【讨论】:

    【解决方案3】:

    我遇到了下一个错误:

    Caused by: org.postgresql.util.PSQLException: ERROR: column "status" is of type topic_status but expression is of type character varying
      Hint: You will need to rewrite or cast the expression.
    

    DbUnit 请求元表并从 PostgreSQL 接收类型 VARCHAR 枚举。但 PostgreSQL 不会再接受这种类型。

    我用下一个方式覆盖了PostgresqlDataTypeFactory 的方法:

    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, 
        new PostgresqlDataTypeFactory() {
            @Override
            public boolean isEnumType(String sqlTypeName) {
                return "topic_status".equalsIgnoreCase(sqlTypeName);
            }
    
            @Override
            public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException {
                if (isEnumType(sqlTypeName)) {
                    sqlType = Types.OTHER;
                }
                return super.createDataType(sqlType, sqlTypeName);
            }
        });
    );
    

    这将枚举的类型设置为OTHER,父方法super.createDataType(sqlType, sqlTypeName) 以正确的方式创建DataType

    PostgreSQL 版本:9.6.5
    DbUnit 版本:2.5.4

    更多信息请访问discussion

    【讨论】:

      【解决方案4】:

      对 postgresql 枚举的支持有限,因为自 dbunit 2.4.6 起仅支持读取和写入字符串。为此,您必须像这样覆盖 PostgresqlDataTypeFactory 中的方法“isEnumType”:

      PostgresqlDataTypeFactory factory = new PostgresqlDataTypeFactory(){
        public boolean isEnumType(String sqlTypeName) {
          if(sqlTypeName.equalsIgnoreCase("abc_enum")){
            return true;
          }
          return false;
        }
      }; 
      

      【讨论】:

        猜你喜欢
        • 2013-09-19
        • 2019-01-08
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        相关资源
        最近更新 更多