我正在处理Spring Batch应用程序。在我的阅读器中,我正在从这样的路径读取XML文件:
setSize();
现在,在我的处理器中,我想获取一些处理的资源详细信息。我无法在ItemReader<Foo> xmlFileItemReader(){
Resource[] resources = getResources();
MultiResourceItemReader<Foo> reader = new MultiResourceItemReader<>();
reader.setResources(resources);
StaxEventItemReader<Foo> xmlFileReader = new StaxEventItemReader<>();
xmlFileReader.setFragmentRootElementName("Foo");
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(Foo.class);
xmlFileReader.setUnmarshaller(marshaller);
reader.setDelegate(xmlFileReader);
return reader;
}
中实现ResourceAware
,因为无法更改它。所以,我尝试过这样的事情,
Foo
}
我这样修改了我的阅读器,
public class CustomFoo extends Foo implements ResourceAware{
@XmlTransient
private Resource resource;
@Override
public void setResource(Resource resource) {
this.resource = resource;
}
}
我的处理器看起来像这样,
ItemReader<CustomFoo> xmlFileItemReader(){
Resource[] resources = getResources();
MultiResourceItemReader<CustomFoo> reader = new MultiResourceItemReader<>();
reader.setResources(resources);
StaxEventItemReader<CustomFoo> xmlFileReader = new StaxEventItemReader<>();
xmlFileReader.setFragmentRootElementName("Foo");
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(CustomFoo.class);
xmlFileReader.setUnmarshaller(marshaller);
reader.setDelegate(xmlFileReader);
return reader;
}
它没有用。它仍被解组到public class FooProcessor implements ItemProcessor<CustomFoo, Bar>{
@Override
public Bar process(CustomFoo item) throws Exception {
//process
}
对象,因此抛出了ClassCastException
。
我也尝试使用Foo
。它也不起作用。
我要做的只是将XmlAdapter
传递给我的处理器。请帮忙!预先感谢。
答案 0 :(得分:1)
MultiResourceItemReader
stores在执行上下文中当前资源的索引(使用键:resourceIndex
)。这意味着,如果您的ItemProcessor
可以访问执行上下文,那么您就完成了。
现在,为了从项目处理器访问执行上下文,您可以:
@BeforeStep
方法并按照步骤Passing Data to Future Steps中的说明存储步骤执行上下文的句柄ItemProcessor
实现ItemStream
界面我见过人们在处理器中注入MultiResourceItemReader
并在处理器内部调用MultiResourceItemReader#getCurrentResource
,但是我不推荐这种方法,因为它将您的处理器耦合到读取器上。
希望这会有所帮助。