Spring Batch中ItemReader
的配置如下:
@Bean public StaxEventItemReader<Foo> fooXmlReader() {
final StaxEventItemReader<Foo> itemReader = new StaxEventItemReader<>();
itemReader.setResource(new FileSystemResource("/my/foo/file.xml"));
itemReader.setFragmentRootElementName("Foo");
itemReader.setUnmarshaller(fooUnmarshaller());
itemReader.setStrict(false);
return itemReader;
}
@Bean public Jaxb2Marshaller fooUnmarshaller() {
final Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("org.group.jobs.foo.jaxb");
marshaller.setMappedClass(Foo.class);
return marshaller;
}
file.xml
如下所示:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE Bar SYSTEM "Bar.dtd">
<Bar>
<TS>20170531220004000</TS>
<Foo>
<Bla>10101</Bla>
</Foo>
<Foo>
<Bla>10111</Bla>
</Foo>
</Bar>
Bar.dtd
:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT Bar (TS, Foo+)>
<!ELEMENT TS (#PCDATA)>
<!ELEMENT Foo (Bla)>
<!ELEMENT Bla (#PCDATA)>
当启动项目并启动,注入和初始化时,我得到以下异常:
com.ctc.wstx.exc.WstxParsingException: (was java.io.FileNotFoundException) C:\projects\apps\myproject\Bar.dtd (Das System kann die angegebene Datei nicht finden)
at [row,col {unknown-source}]: [2,63]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:630)
at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:461)
at com.ctc.wstx.sr.ValidatingStreamReader.findDtdExtSubset(ValidatingStreamReader.java:475)
at com.ctc.wstx.sr.ValidatingStreamReader.finishDTD(ValidatingStreamReader.java:358)
at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3737)
at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2082)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
at com.ctc.wstx.evt.WstxEventReader.peek(WstxEventReader.java:306)
at org.springframework.batch.item.xml.stax.DefaultFragmentEventReader.peek(DefaultFragmentEventReader.java:173)
at org.springframework.batch.item.xml.StaxEventItemReader.moveCursorToNextFragment(StaxEventItemReader.java:151)
显然找不到DTD文件。通常我会为此目的写一个EntityResolver
。但我不知道在StaxEventItemReader
或Jaxb2Marshaller
中配置它的位置。
任何帮助将不胜感激!