Spring Batch使用StaxEventItemReader / Jaxb2Marshaller使用本地DTD读取XML

时间:2017-08-01 16:35:01

标签: xml spring xml-parsing spring-batch dtd

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。但我不知道在StaxEventItemReaderJaxb2Marshaller中配置它的位置。

任何帮助将不胜感激!

0 个答案:

没有答案