【问题标题】:How to format output date in Itemwriter?如何在 Itemwriter 中格式化输出日期?
【发布时间】:2014-11-18 11:23:33
【问题描述】:

我有一个域类如下

class SubScritpion{

 private String subScripId;
 private String useId;
 private  Date subScripDate;
 private Date billStartDate;
 private Date billEndDate;
 private  int amount;

 //getters and Setters
}

我正在从数据库中读取数据类型为数据库中时间戳的数据并将其转换为 java.util.Date 并使用flatefileItemwriter 写入 csv 文件,我的 ItemWriter 如下。

<bean id="kpCvsFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"
        scope="step">
        <!-- write to this csv file -->
        <property name="resource" value="file:/#{jobParameters['abs.file.path']}" />
        <property name="shouldDeleteIfExists" value="true" />

        <property name="lineAggregator">
            <bean
                class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                <property name="delimiter" value="," />

                <property name="fieldExtractor">
                    <bean
                        class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                        <property name="names"
                            value="subScripId,useId,subScripDate,billStartDate,billEndDate,amount" />
                    </bean>
                </property>
            </bean>
        </property>

        <property name="headerCallback" ref="kpFileHeader" />

    </bean>

现在问题是日期格式我的数据库的日期格式为17-NOV-14 04.25.06.806000000 AM,但 csv 文件包含日期格式Mon Nov 17 04:25:06 UTC 2014

虽然我找到了一些有关 ItemReader 的参考资料,但我没有找到任何可以插入 ItemWriter 的格式。

一种方法是通过引入 ItemProcesser 并使用 SimpleDateFormatter 将日期格式转换为 String 并写入域 ojbect 中的新字段来解决此问题,然后引用此新字段而不是 itemWriter 中归档的日期。

但我想要一个类似于CustomEditor 的更简洁的解决方案,可以在spring xml 中应用值类型。有人可以指出这方面的一些资源或方向

【问题讨论】:

标签: java spring date spring-batch


【解决方案1】:

您正在寻找的“格式化程序”是LineAggregator。目前您正在使用DelimitedLineAggregator,它在解决数据的分隔方面问题时,不解决格式问题。看看FormatterLineAggregator。它允许您通过指定字符串格式(使用String.format())来格式化从LineAggregator 生成的输出String。从那里您应该能够指定您希望呈现日期的格式。

【讨论】:

  • 那不能解决我的问题 FormatterLineAggreator 不能解决问题。我创建了如下格式化程序。 %1$td-%1$Tb-%1$ty %1$tI.%1$tM.%1$tS.%1$tN %1$Tp,%2$d.但是,由于 fieldextractor 传递的是空而不是 null %2$d 失败。
  • 将数据提取到一行有两个阶段。第一个是通过FieldExtractor 从项目中提取字段。如果您需要空值而不是空字符串,请创建自定义 FieldExtractor 实现。第二阶段是将这些字段格式化为所需的输出。您的问题是关于第二阶段,如果您提供第一阶段的正确数据,FormatterLineAggergator 可以工作。
  • 非常感谢您的意见!1 我正在考虑自定义 fieldEtractor。但是因为你是 SB 的 PL,所以我想问你一个问题,你不认为应该有侄女的方式来处理格式化,特别是对于日期(java 有很多混乱的日期,现在又是新的日期 api爪哇 8)?虽然我更喜欢使用 simpledateformat
  • 没有什么可以阻止您创建自己的LineAggregator 并将您自己的格式化逻辑放入其中。我想我们可以添加一种按类型注册自定义转换器的方法,但是对于如此简单的事情来说可能有点复杂......
  • @Michael Minella - 你能分享一下代码 sn-p 吗?由于您是 Spring Batch 的鼻祖,因此我们希望始终使用代码 sn-p。请做必要的事情。
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多