我收到一个csv文件作为webservice调用需要加密。现在我将它保存在临时目录中,将其作为setResource提供给Reader。
有没有办法提供stream(byte [])而不是先保存文件?
答案 0 :(得分:7)
setResource
的方法ItemReader
将org.springframework.core.io.Resource
作为参数。这个类有一些开箱即用的实现,其中你可以找到org.springframework.core.io.InputStreamResource
。这个类的构造函数需要一个java.io.InputStream
,可以由java.io.ByteArrayInputStream
实现。
从技术上讲,是的,您可以在byte[]
中使用ItemReader
参数。
现在,关于如何实际做到这一点,这里有一些想法:
1)创建自己的FlatFileItemReader
(因为CSV是一个平面文件)并使其实现StepExecutionListener
public class CustomFlatFileItemReader<T> extends FlatFileItemReader<T> implements StepExecutionListener {
}
2)覆盖beforeStep
方法,进行web服务调用并将结果保存在变量中
private byte[] stream;
@Override
public void beforeStep(StepExecution stepExecution) {
// your webservice logic
stream = yourWebservice.results();
}
3)覆盖setResource
方法以将此stream
作为实际资源传递。
@Override
public void setResource(Resource resource) {
// Convert byte array to input stream
InputStream is = new ByteArrayInputStream(stream);
// Create springbatch input stream resource
InputStreamResource res = new InputStreamResource(is);
// Set resource
super.setResource(res);
}
此外,如果您不想在ItemReader中调用您的Web服务,您只需将字节数组存储在JobExecutionContext
中,并使用beforeStep
的{{1}}方法获取它