Я работаю над приложением Spring Batch.В моем читателе я читаю XML-файлы по следующему пути:
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
.Это тоже не сработало.
Все, что я хочу, это передать Resource
моему процессору.Пожалуйста помоги!Заранее спасибо.