私のWebサービスは、!DOCTYPE宣言を含むサードパーティソースからxmlを受け取ります。したがって、私は最初のものは私にこの例外を与えて、XML文書を解析するために、私のコントローラ内の第二の方法を使用する必要があります。 Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not unmarshal to [class com.example.MeterBusXml]: null; nested exception is javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 48; DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.]
spring mvc xmlとdtdの相対パスを持つxml
私はどの記事アプリケーション、XMLを制御することはできませんので、私は解析する私のWebサービスを適応しなければなりませんそれはdtdと一緒です。
私の質問は、XMLReader
インスタンスにEntityResolver
を注入するスプリングフレームワークの方法は何ですか?
@RestController
public class MeterBusDataController {
@RequestMapping (
consumes = APPLICATION_XML_VALUE,
method = POST,
path = "/meterbus1"
)
public void method1(@RequestBody MeterBusXml xml) {
System.out.println(xml);
}
@RequestMapping(
method = POST,
path = "/meterbus2"
)
public void method2(HttpServletRequest rq) throws IOException, ParserConfigurationException, SAXException, JAXBException {
JAXBContext jc = newInstance(MeterBusXml.class);
Unmarshaller um = jc.createUnmarshaller();
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setValidating(true);
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
return new InputSource(new StringReader(""));
}
});
BufferedReader reader = rq.getReader();
InputSource inputSource = new InputSource(reader);
SAXSource saxSource = new SAXSource(xr, inputSource);
MeterBusXml xml = (MeterBusXml)um.unmarshal(saxSource);
System.out.println(xml);
}
}
私は非整列化しようとしているmbus.xmlの例については、次のドキュメントを参照してください。 http://prevodniky.sk/products/product_EthMBus_common/download/Ethernet_converters_exports_v1_02_EN.pdf