SpringBatch ItemProcessor:处理List <! - ? - >而不是一个Item

时间:2016-03-16 22:31:29

标签: json spring-batch

我必须修改使用SpringBatch创建的进程,这个过程很容易。 实际上,程序从数据库中读取记录并将结果导出到XML文件(每个表一个)

现在,我想写JSON文件而不是XML文件,我没有找到如何使它成为可能,但阅读和阅读我有一些接近我想要的东西。

我写了一个ItemProcessor这样的课程

@Component("jSONObjectProcessor")
public class JSONObjectProcessor implements ItemProcessor<Object, String> {

    private Gson gson = new Gson();
    private List<Object> array = new ArrayList<Object>();

    @Override
    public String process(Object item) throws Exception {
        array.add(item);
        return gson.toJson(array);
    }
}

显然,如果我有6 items;这将返回6 List,就像它现在一样

第1项

[  
   {  
     "number":0,
     "string":"abc",
     "desc":"abcdefg"
   }
]

第二项

[  
   {  
     "number":0,
     "string":"abc",
     "desc":"abcdefg"
   },
   {  
     "number":1000,
     "string":"xyz",
     "desc":"uvwxyz"
   }
]
//more lists by the total of items

要编写我正在使用org.springframework.batch.item.file.FlatFileItemWriter类的文件。

我想找到返回List中所有项目并给它JSON格式并在文件中写入这个json的方法。我是以正确的方式或者有另一种更优雅的形式。有可能吗?

谢谢!

更新

我做了更改(感谢@Sanj),但我错过了每个对象之间的逗号(,)分隔符。

我的ItemWriter定义如下

<bean id="itemWriterRegConstantes" scope="step" 
    class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" value="#{jobParameters['fileOutput']}" />
    <property name="shouldDeleteIfExists" value="true" />
    <property name="lineAggregator">
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
            <property name="delimiter" value="," />
        </bean>
    </property>
    <property name="footerCallback" ref="headerFooterCallback" />
    <property name="headerCallback" ref="headerFooterCallback" />
</bean> 

输出文件现在看起来像这样

[
    {"number":0,"string":"abcd","desc":"efgh"} //no comma
    {"number":1000,"string":"xyz","valor":"xyzw"}
]

如何添加?

另外,如何在一行中打印所有内容? (缩小内容)这可能吗?

我的解决方案

我必须创建自己的类(我真的改变了FlatFileItemWriter SpringBatch类,它是here

输出:具有一行JSON数组内容的文件。 谢谢!

1 个答案:

答案 0 :(得分:0)

从ItemProcessor

返回每个项目的单个json
@Component("jSONObjectProcessor")
public class JSONObjectProcessor implements ItemProcessor<Object, String> {

    private Gson gson = new Gson();

    @Override
    public String process(Object item) throws Exception {

        return gson.toJson(item);
    }
}

创建页眉和页脚回调。基本上它们将分别用于启动和关闭数组。

public class JSONHeaderFooterCallBack implements FlatFileHeaderCallback, FlatFileFooterCallback{

    @Override
    public void writeHeader(Writer writer) throws IOException {
        writer.write("[" + System.getProperty("line.separator"));       
    }

    @Override
    public void writeFooter(Writer writer) throws IOException {
        writer.write("]");
    }
}

将回调与FlatFileItemWriter

相关联
FlatFileItemWriter<String> writer = new FlatFileItemWriter<String>(); 
//Setting header and footer.
JSONHeaderFooterCallBack headerFooterCallback = new JSONHeaderFooterCallBack();
writer.setHeaderCallback(headerFooterCallback);
writer.setFooterCallback(headerFooterCallback);
writer.setResource(new FileSystemResource(System.getProperty("user.dir") + "/output.json"));

现在你可以使用&#34; writer&#34;将所有记录作为json数组写入文件。 的 ---更新 - 使用CustomLineAggregator在每条记录的末尾添加逗号:

public class CustomLineAggregator<String> implements LineAggregator<String> {

    @Override
    public String aggregate(String item) {
        return item+",";
    }
}