我有一个Spring应用程序(https://spring.io/projects/spring-batch),它从一个.csv文件中读取逗号分隔的数据,然后将每一列映射到特定的Java,将其保存到一个数据库(postgres)。我的问题是,一个名为END_DT的日期/时间列正在用不正确的日期/时间部分写入数据库。您可以看到日期部分已正确读取(2023-04-15),但时间只写为00:00:00.000000。
它所执行的更深入的步骤是:
dd-mmm-YYYY HH:mm:ss
格式的字符串(即29-4月-2099 23:59:59):h 213g 214
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)文件
G 231
@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)。有人知道怎么解决这个问题吗?有很多接口和过激的方法,所以我还没有明确指出这种映射发生在哪里。
发布于 2021-02-07 19:44:12
我能够解决这个问题,并将在这里张贴我的答案。我还想说明这是一个遗留应用程序(实际上并不太老),但它使用的类有“时间戳”和"SimpleDateFormat“(预Java8API更新),所以我的目的是用最少的精力解决这个问题/bug/问题,而不必重写应用程序。希望这对有类似应用程序/业务问题的任何其他开发人员都有帮助。
DozerConverter<String, LocalDateTime>
类来为这个字符串-> LocalDateTime对象创建自己的自定义转换器。但是,我遇到了一些问题,Dozer抛出异常试图映射我们的数据库列使用的LocalDateTime对象-> java.sql.Timestamp数据类型。我们有另一个带有所有数据库配置的回购,因此,我再次不想进入该依赖项和编辑代码(这可能会破坏更多的组件,因为它们依赖它),所以我当时就把想法搞砸了。当您使用像这样转换的自定义时,Dozer有一个.xml (在您的资源目录中)文件,您必须将这个转换器附加到您要映射的特定字段,如下所示:
<field custom-converter="com.mydomainname.my.namespace.MyCustomConverter">
<a>theColumnNameIamMappingFrom</a>
<b>theColumnNameIamMappingTo</b>
</field>
java.sql.Timestamp
数据类型。我试图避免使用这些旧的遗留类,但是代码的其他部分似乎太紧了,而且我不想破坏所有的东西。不管怎样,它起了作用,我终于能够看到DB将时间戳保存为完整的日期和时间,即。
2020-08-31 23:59:59.123456
希望这有助于其他人,如果他们有类似的问题。Dozer有点奇怪,但是您可以在这里读到更多关于它的信息:https://www.baeldung.com/dozer
https://stackoverflow.com/questions/66073085
复制相似问题