, поэтому я создаю свою первую весеннюю пакетную работу.Я пытаюсь читать в XML, манипулировать некоторыми значениями, и записать его.Моя работа, кажется, распаковывает мой XML-документ и записывает его нормально, если я не реализую интерфейс org.springframework.batch.item.ItemProcessor.Как только я реализую интерфейс, который мне нужно сделать, чтобы манипулировать значениями, я получаю сообщение об ошибке ниже.Когда я проверяю выходной файл, он выводит тег xml, тег начального корневого элемента и ничего больше.Если я закомментирую вызов моего процессора на шаге 1 моей работы, то файл будет записан в мою файловую директорию.Буду признателен за любую помощь, я искал повсюду, и мне не повезло.Мое сообщение проверяется на наличие нескольких больших xsd, поэтому я не включил их в код.
2018-05-21 15: 58: 57.690 ОШИБКА 6684 --- [main] osbatch.core.step.AbstractStep: Обнаружена ошибка при выполнении шага step1 в задании importUserJob. Java.lang.ClassCastException: javax.xml.bind.JAXBElement не может быть приведен к [mySchema] BatchProcessor.process (BatchProcessor.java:1) ~ [classes /: na]
public class BatchProcessor implements ItemProcessor<ProdRequest, ProdRequest>{
@Override
public ProdRequest process(ProdRequest arg0) throws Exception {
//Error still thrown even when I comment out all of the code. Break points in this methoda re never reached.
return arg0;
}
}
-
@Configuration
@EnableBatchProcessing
public class XMLReaderConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public BatchProcessor processor() {
return new BatchProcessor();
}
@Bean(destroyMethod="")
public StaxEventItemReader<ProdRequest> reader(){
StaxEventItemReader<ProdRequest> reader = new StaxEventItemReader<>();
reader.setResource(new ClassPathResource("policy.xml"));
reader.setFragmentRootElementName("ProdRequest");
Jaxb2Marshaller xmlMarshaller = new Jaxb2Marshaller();
ObjectFactory objectFactory = new ObjectFactory();
xmlMarshaller.setClassesToBeBound(new Class[] {
//all of my object classes (all generated by JAXB) I have added the xmlRootElement attribute to my top level class only.
});
xmlMarshaller.setSupportJaxbElementClass(true);
reader.setUnmarshaller(xmlMarshaller);
return reader;
}
@Bean(destroyMethod="")
public StaxEventItemWriter<ProdRequest> writer(){
StaxEventItemWriter<ProdRequest> writer = new StaxEventItemWriter<ProdRequest>();
String exportFilePath = "C:/Test/springBatchTest.xml";
writer.setResource(new FileSystemResource(exportFilePath));
writer.setRootTagName("ProdRequest");
Jaxb2Marshaller xmlMarshaller = new Jaxb2Marshaller();
xmlMarshaller.setClassesToBeBound(new Class[] {
//all of my object classes (all generated by JAXB) I have added the xmlRootElement attribute to my top level class only.
});
xmlMarshaller.setSupportJaxbElementClass(true);
writer.setMarshaller(xmlMarshaller);
return writer;
}
@Bean
public Step step1(){
return stepBuilderFactory.get("step1")
.<ProdRequest, ProdRequest> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
@Bean
public Job importUserJob(){
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
}