Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DBunit-无法进行类型转换<;1997/02/14>;时间戳_Java_Hibernate_Hsqldb_Dbunit - Fatal编程技术网

Java DBunit-无法进行类型转换<;1997/02/14>;时间戳

Java DBunit-无法进行类型转换<;1997/02/14>;时间戳,java,hibernate,hsqldb,dbunit,Java,Hibernate,Hsqldb,Dbunit,接下来,我将使用DBUnit(2.49)+Hibernate(4.1.3)进行集成测试 String formats[] = {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need Timestamp ts = null; for (int i = 0; i < formats.length; i++) { SimpleDateFormat sdf = new S

接下来,我将使用DBUnit(2.49)+Hibernate(4.1.3)进行集成测试

    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
  • 生产数据库:Oracle 10
  • 测试数据库:Hsqldb 2.3.3

上下文 我的数据包含日期的当前格式:
yyyy/MM/dd
。但是,根据DBUnit常见问题解答,DBUnit只支持这种格式
yyyy-mm-dd hh:mm:ss.fffffffff
,因此我必须为时间戳创建一种新格式

    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
我是如何试图修复它的
  • 我基于此创建了一个
    CustomTimeStampDataType
    。我改变了这部分:

    String formats[] = {"yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm a", "yyyy-MM-dd HH:mm:ss.fffffffff"};
    
        String formats[] =
         {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
         Timestamp ts = null;
         for (int i = 0; i < formats.length; i++) 
         {
         SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
         try {
             java.util.Date date = sdf.parse(stringValue);
             ts = new Timestamp(date.getTime());
             return ts;
         }
         catch( ParseException e) {
        }
    
在这一点上:

    String formats[] = {"yyyy/MM/dd"};
    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
  • 我按照相同的教程创建了一个
    CustomeDataTypeFactory
    。我只让它扩展
    Oracle10DataTypeFactory
    ,而不是
    defaultdatatypefactory
  • hibernatedbunitestcase
    中,我使用以下内容覆盖
    setDatabaseConfig()

    @Override
    protected void setUpDatabaseConfig(DatabaseConfig config){
        config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new CustomDataTypeFactory());
      }
    
        String formats[] =
         {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
         Timestamp ts = null;
         for (int i = 0; i < formats.length; i++) 
         {
         SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
         try {
             java.util.Date date = sdf.parse(stringValue);
             ts = new Timestamp(date.getTime());
             return ts;
         }
         catch( ParseException e) {
        }
    
但我有新的错误 我运行了一个单元测试,得到了这个错误

org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <1997/02/14> of type <java.lang.String> to TIMESTAMP
    at org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:120)
    at org.dbunit.dataset.datatype.TimestampDataType.setSqlValue(TimestampDataType.java:176)
    at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
    at org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
    at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
    at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
    at test.HibernateDbUnitTestCase.setUp(HibernateDbUnitTestCase.java:85)
    at test.PlayerTest.setUp(PlayerTest.java:117)

Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
    at java.sql.Timestamp.valueOf(Unknown Source)
    at org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:116)
    ... 20 more
    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
org.dbunit.dataset.datatype.TypeCastException:无法将类型的值类型转换为时间戳
位于org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:120)
位于org.dbunit.dataset.datatype.TimestampDataType.setSqlValue(TimestampDataType.java:176)
位于org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
位于org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
位于org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
位于org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
位于org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
位于org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
在test.hibernatedbunitestcase.setUp(hibernatedbunitestcase.java:85)
在test.PlayerTest.setUp(PlayerTest.java:117)
原因:java.lang.IllegalArgumentException:时间戳格式必须为yyyy-mm-dd hh:mm:ss[.fffffffff]
位于java.sql.Timestamp.valueOf(未知源)
位于org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:116)
... 20多
这很奇怪,似乎我的CustomTimeStamp没有被调用,所以我使用默认格式更改了数据集中的日期:1997-02-14 00:00:00.0,然后再次运行单元测试。然后我得到:

org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <1997-02-14 00:00:00.0> of type <java.lang.String> to TIMESTAMP
    at test.CustomTimestampDataType.typeCast(CustomTimestampDataType.java:69)
    at test.CustomTimestampDataType.setSqlValue(CustomTimestampDataType.java:84)
    at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
    at org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
    at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
    at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
    at test.HibernateDbUnitTestCase.setUp(HibernateDbUnitTestCase.java:85)
    at test.PlayerTest.setUp(PlayerTest.java:117)
    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
org.dbunit.dataset.datatype.TypeCastException:无法将类型的值类型转换为时间戳
在test.CustomTimestampDataType.typeCast(CustomTimestampDataType.java:69)中
在test.CustomTimestampDataType.setSqlValue(CustomTimestampDataType.java:84)
位于org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
位于org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
位于org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
位于org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
位于org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
位于org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
在test.hibernatedbunitestcase.setUp(hibernatedbunitestcase.java:85)
在test.PlayerTest.setUp(PlayerTest.java:117)
这意味着CustomTimeStamp实际上被称为。这个问题似乎源于DatabaseTestCase.setUp,它以某种方式调用了错误的TimeStampDataType

    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
如何解决此问题?
  • 我的第一个选择是使用正则表达式将数据集中的每个
    yyyy/MM/dd
    替换为
    yyy-MM-dd
    。这很好,直到我不得不测试一个方法,该方法根据请求选择一个日期(因此格式为YYYYMM dd)并将其与当前日期进行比较。(因此格式为yyyy/mm/dd)。Hsqldb无法比较两个格式不同的日期

  •     String formats[] =
         {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
         Timestamp ts = null;
         for (int i = 0; i < formats.length; i++) 
         {
         SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
         try {
             java.util.Date date = sdf.parse(stringValue);
             ts = new Timestamp(date.getTime());
             return ts;
         }
         catch( ParseException e) {
        }
    
  • 我的第二个选择是反编译dbunit.jar,根据教程重写TimeStampDataType。我不熟悉字节码编写,所以在进入未知领域之前,我想知道您是否有其他解决方案

  •     String formats[] =
         {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
         Timestamp ts = null;
         for (int i = 0; i < formats.length; i++) 
         {
         SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
         try {
             java.util.Date date = sdf.parse(stringValue);
             ts = new Timestamp(date.getTime());
             return ts;
         }
         catch( ParseException e) {
        }
    
提前谢谢

修复了它

    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
所以我最终选择了第二种选择。 这是那些需要它的人的详细路径

    String formats[] =
     {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
     Timestamp ts = null;
     for (int i = 0; i < formats.length; i++) 
     {
     SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
     try {
         java.util.Date date = sdf.parse(stringValue);
         ts = new Timestamp(date.getTime());
         return ts;
     }
     catch( ParseException e) {
    }
  • 下载
    dbUnit.2.2.source.jar
  • 打开罐子的拉链
  • 转到Eclipse,
    File>New>Java项目
  • 取消选中“使用默认位置”
  • 在位置:指定从jar创建的新文件夹的路径
  • 单击
    Finish
  • 修改TimestampDataType.java(如果需要)

        String formats[] =
         {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
         Timestamp ts = null;
         for (int i = 0; i < formats.length; i++) 
         {
         SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
         try {
             java.util.Date date = sdf.parse(stringValue);
             ts = new Timestamp(date.getTime());
             return ts;
         }
         catch( ParseException e) {
        }
    
    • 而不是
      ts=java.sql.Timestamp.valueOf(stringValue)使用下面的代码

          String formats[] =
           {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
           Timestamp ts = null;
           for (int i = 0; i < formats.length; i++) 
           {
           SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
           try {
               java.util.Date date = sdf.parse(stringValue);
               ts = new Timestamp(date.getTime());
               return ts;
           }
           catch( ParseException e) {
          }
      
  • 右键单击项目,然后导出
  • 选择
    JAR文件
    ,然后选择
    Next
  • 填写导出目的地,然后
    Finish
  • 您只需将这个新的jar添加到库中即可使其正常工作