在Spring Batch中将资源传递给处理器

时间:2018-10-25 03:13:25

标签: xml jaxb spring-batch

我正在处理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传递给我的处理器。请帮忙!预先感谢。

1 个答案:

答案 0 :(得分:1)

MultiResourceItemReader stores在执行上下文中当前资源的索引(使用键:resourceIndex)。这意味着,如果您的ItemProcessor可以访问执行上下文,那么您就完成了。

现在,为了从项目处理器访问执行上下文,您可以:

我见过人们在处理器中注入MultiResourceItemReader并在处理器内部调用MultiResourceItemReader#getCurrentResource,但是我不推荐这种方法,因为它将您的处理器耦合到读取器上。

希望这会有所帮助。