首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java中的"Dozer“将日期/时间字符串映射到java.sql.Timestamp并在DB中保存是写入时间为00:00:00.000000

使用Java中的"Dozer“将日期/时间字符串映射到java.sql.Timestamp并在DB中保存是写入时间为00:00:00.000000
EN

Stack Overflow用户
提问于 2021-02-06 02:43:19
回答 1查看 474关注 0票数 1

我有一个Spring应用程序(https://spring.io/projects/spring-batch),它从一个.csv文件中读取逗号分隔的数据,然后将每一列映射到特定的Java,将其保存到一个数据库(postgres)。我的问题是,一个名为END_DT的日期/时间列正在用不正确的日期/时间部分写入数据库。您可以看到日期部分已正确读取(2023-04-15),但时间只写为00:00:00.000000。

它所执行的更深入的步骤是:

  1. Spring批处理应用程序在具有多列的.CSV文件中读取,这个问题的重要内容是end_dt
  2. 来自end_dt列,使用以下方法解析出dd-mmm-YYYY HH:mm:ss格式的字符串(即29-4月-2099 23:59:59):h 213g 214

代码语言:javascript
运行
复制
private String getDateTimeString(String dateString) {

        SimpleDateFormat sdfTo = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
        SimpleDateFormat sdfFrom = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
        String formattedDateTimeStr = null;
       
            if (StringUtils.isNotEmpty(dateString)) {
                formattedDateTimeStr = sdfTo.format(sdfFrom.parse(dateString));
          }
        
        return formattedDateTimeStr;
}

然后,它将这个解析日期/时间字符串保存到数据类/Java中,我们将调用DaMasterRecord,保存excel (.csv)文件

  • 中的所有列值,然后使用Dozer,这些来自数据类的值被映射到使用Hibernate/JPA将字符串日期/时间转换为java.sql.Timestamp数据类型的实体类,即

G 231

代码语言:javascript
运行
复制
@Entity
@Table(name = "blah_blah_blah", schema = "some_schema", catalog = "some_catalog")
// code inbetween

public class MyRandomClassEntity {
  private Timestamp endDt;

// more stuff
}

我知道在DaMasterRecord数据类中正确地解析了日期/时间字符串,因为我可以在调试器中看到它。在Dozer框架中调用Mapper接口方法"mapper“之后,我看到了通过调试器在实体类中列出的错误日期/时间。因此,我不太清楚Dozer是如何实现它的映射的,但我猜测Dozer何时将“datatype :mm:ss”的字符串映射到java.sql.Timestamp数据类型,因为某种原因,它没有正确地映射日期/时间字符串的“时间”部分(它只是执行00:00:00.000000)。有人知道怎么解决这个问题吗?有很多接口和过激的方法,所以我还没有明确指出这种映射发生在哪里。

EN

回答 1

Stack Overflow用户

发布于 2021-02-07 19:44:12

我能够解决这个问题,并将在这里张贴我的答案。我还想说明这是一个遗留应用程序(实际上并不太老),但它使用的类有“时间戳”和"SimpleDateFormat“(预Java8API更新),所以我的目的是用最少的精力解决这个问题/bug/问题,而不必重写应用程序。希望这对有类似应用程序/业务问题的任何其他开发人员都有帮助。

  1. 所以我第一次尝试扩展Dozer的DozerConverter<String, LocalDateTime>类来为这个字符串-> LocalDateTime对象创建自己的自定义转换器。但是,我遇到了一些问题,Dozer抛出异常试图映射我们的数据库列使用的LocalDateTime对象-> java.sql.Timestamp数据类型。我们有另一个带有所有数据库配置的回购,因此,我再次不想进入该依赖项和编辑代码(这可能会破坏更多的组件,因为它们依赖它),所以我当时就把想法搞砸了。

当您使用像这样转换的自定义时,Dozer有一个.xml (在您的资源目录中)文件,您必须将这个转换器附加到您要映射的特定字段,如下所示:

代码语言:javascript
运行
复制
<field custom-converter="com.mydomainname.my.namespace.MyCustomConverter">
     <a>theColumnNameIamMappingFrom</a>
     <b>theColumnNameIamMappingTo</b>
</field>

  1. I还尝试将DateTime字符串的格式保持为“yyyy:mm:ss”,这是时间戳的格式。但是,每次它映射到我的数据库/实体类时,由于某种原因,它总是将时间部分“削减”到00:00:00.000000。

  1. 因此最后一个解决方案是第一个版本的变体,在那里我创建了一个自定义转换器,但这次它被转换成java.sql.Timestamp数据类型。我试图避免使用这些旧的遗留类,但是代码的其他部分似乎太紧了,而且我不想破坏所有的东西。不管怎样,它起了作用,我终于能够看到DB将时间戳保存为完整的日期和时间,即

代码语言:javascript
运行
复制
2020-08-31 23:59:59.123456

希望这有助于其他人,如果他们有类似的问题。Dozer有点奇怪,但是您可以在这里读到更多关于它的信息:https://www.baeldung.com/dozer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66073085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档