Spring batch Spring批处理数据库到固定格式文件程序-问题与输出到文件

Spring batch Spring批处理数据库到固定格式文件程序-问题与输出到文件,spring-batch,Spring Batch,我有一个spring批处理程序,在这个程序中,我将从数据库写入一个固定格式的文件 我的数据库表由5列组成。所有列都包含有关某个产品的说明。该列为varchar类型,每个大小为200 我正在阅读我的pojo中列的描述,作为5个字符串属性,即。描述1,描述2,描述3,描述4,描述5 我的项目编写器如下所示: <beans:bean id="DbToFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWri

我有一个spring批处理程序,在这个程序中,我将从数据库写入一个固定格式的文件

我的数据库表由5列组成。所有列都包含有关某个产品的说明。该列为varchar类型,每个大小为200

我正在阅读我的pojo中列的描述,作为5个字符串属性,即。描述1,描述2,描述3,描述4,描述5

我的项目编写器如下所示:

<beans:bean id="DbToFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <beans:property name="resource" value="file:c:\TestData\output.dat" /> 

    <beans:property name="lineAggregator">
        <beans:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator">
            <beans:property name="fieldExtractor">
                <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                 <beans:property name="names" value="desc1, desc2, desc3, desc4, desc5" /> 
                </beans:bean>
            </beans:property>

            <beans:property name="format" value="%-20s%-30s%-30s%-30s%-30s" /> 
        </beans:bean>
    </beans:property>
</beans:bean>
如图所示,我希望desc1位于一个20个字符的固定长度字段中,而desc2到desc4位于一个30个字符的固定长度字段中

然而,问题是,我得到的是整个desc字符串,与大小无关。也就是说,如果desc1是数据库中的40个字符,那么它在文件中也是40个字符

我觉得应该只使用前20个字符,而忽略其他字符

问题是什么?是虫子还是我做错了什么


谢谢你的阅读

最简单的解决方案是更改读取器,例如,您可以在表上创建SQL视图或编写自定义SQL查询,如:

select substr(desc1,1,20), substr(desc2,1,20), ... from my_table

或者,您可以编写自己的FieldExtractor接口实现,该接口应聚合BeanRapperFieldExtractor。调用BeanWrapperFieldExtractorextract后,它应按给定的最大大小裁剪所有值。

最简单的解决方案是更改读取器,例如,您可以在表上创建SQL视图或编写自定义SQL查询,如:

select substr(desc1,1,20), substr(desc2,1,20), ... from my_table

或者,您可以编写自己的FieldExtractor接口实现,该接口应聚合BeanRapperFieldExtractor。调用BeanwrapPerfielDextActorExtract后,它应按给定的最大大小裁剪所有值。

FormatterLineAggregator在引擎盖下使用,因此您可以使用右边的*来获取所需的内容

两个示例显示格式化程序语法中遗漏的内容

错:

//格式化为至少打印5个字符 字符串错误=String.format%-5s,新对象[]{1234567890}; System.out.PrintLnError; //印刷品:1234567890 正确:

//格式化为至少打印5个字符,最多打印6个字符 String correct=String.format%-5.6s,新对象[]{1234567890}; System.out.printlncorrect; //印刷品:123456
*FormatterLineAggregator的javadoc中也提到了这一点,FormatterLineAggregator在引擎盖下使用,因此您可以使用右边的*来获取所需的内容

两个示例显示格式化程序语法中遗漏的内容

错:

//格式化为至少打印5个字符 字符串错误=String.format%-5s,新对象[]{1234567890}; System.out.PrintLnError; //印刷品:1234567890 正确:

//格式化为至少打印5个字符,最多打印6个字符 String correct=String.format%-5.6s,新对象[]{1234567890}; System.out.printlncorrect; //印刷品:123456
*FormatterLineAggregator的javadoc中也提到了这一点

我想我在某个地方读到过%5s表示将字符串s放在5个字符的空格中,并使用右填充,%-5s表示左填充。。但是,您的答案是正确的…我希望列中的内容精确到10个字符,而不管字符串是<10个字符、等于10个字符还是>10个字符。。。在这种情况下,我应该放%-10.10吗???应该是%-10.10s,请参阅格式化程序Javadoc:-我想我在某个地方读到过%5s表示将字符串s放在5个字符的空格中,用右填充,而%-5s表示用左填充。。但是,您的答案是正确的…我希望列中的内容精确到10个字符,而不管字符串是<10个字符、等于10个字符还是>10个字符。。。在这种情况下我应该放%-10.10吗???应该是%-10.10s,请参阅格式化程序Javadoc:-