我有一个春季批处理程序,我从数据库写入固定格式文件。
我的数据库表包含5列。所有列都包含有关某些产品的说明。该列的类型为varchar,每个大小为200.
我正在阅读我的pojo中的列中的描述为5 String属性即。 desc1,desc2,desc3,desc4,desc5。
我的项目作者如下所示:
<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个字符并忽略其余的字符。
问题是什么?这是一个错误还是我做错了什么?
感谢阅读!
答案 0 :(得分:3)
FormatterLineAggregator使用了String.format(),因此你可以使用正确的Formatter syntax(*)来获得你想要的东西
两个示例,用于显示格式化程序语法中遗漏的内容
错误:
// formatted to print out 5 characters minimum
String wrong = String.format("%-5s", new Object[]{"1234567890"});
System.out.println(wrong);
// prints: 1234567890
正确的:
// formatted to print out 5 characters minimum AND 6 characters maximum
String correct = String.format("%-5.6s", new Object[]{"1234567890"});
System.out.println(correct);
// prints: 123456
(*)这也在FormatterLineAggregator的javadoc中提到
答案 1 :(得分:1)
最简单的解决方案是改变您的读者,例如:您可以在表上创建SQL视图或编写自定义SQL查询,如:
select substr(desc1,1,20), substr(desc2,1,20), ... from my_table
或者,您可以编写自己的FieldExtractor
接口实现,该接口应该聚合BeanWrapperFieldExtractor
。调用BeanWrapperFieldExtractor#extract()
后,它应按给定的最大大小裁剪所有值。