Как избежать проверки dtd при чтении ответа из сообщения в Java/Jboss

Я запускаю JBoss 8.1 на Windows 7 и пытаюсь опубликовать запрос, чтобы получить ответ XML и сопоставить его с моими POJO. Я сделал это с 1 URL, как это

WebTarget webTarget = ClientBuilder.newClient().target(queryString);
Bean bean=webTarget.request(MediaType.APPLICATION_XML).get(Bean.class);

и это дало мне именно то, что я хотел - кучу классов, соответствующих структуре XML.

Теперь я хотел сделать то же самое с постом и другим URL, но в итоге я получил исключение FileNotFoundException и ссылку на файл dtd в xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE oxip SYSTEM "combinations.dtd">

Я не хочу делать проверку, поэтому я сделал следующее:

javax.ws.rs.core.Response vResponse;
WebTarget target=ClientBuilder.newClient().target(queryString);
response = target.request(MediaType.TEXT_XML).post(Entity.text(apiRequest));
String string = vResponse.readEntity(String.class);


JAXBContext jaxbContext = JAXBContext.newInstance(Bean.class);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
InputSource inputSource = new InputSource(new StringReader(string));
SAXSource source = new SAXSource(xmlReader, inputSource);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Bean bean = (Bean) unmarshaller.unmarshal(vSource);

Есть ли способ избежать такого явного использования SaxParser и JaxBContext, как настройка jaxss jaxb, чтобы не использовать проверку??

1 ответ

Решение

Вставив следующий код, проблема была решена:

XMLReader vXmlReader = vSAXParserFactory.newSAXParser().getXMLReader();

//To avoid validating against external dtd which does not exist
EntityResolver entityResolver = new EntityResolver()  {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
    return new InputSource(new StringReader(""));
  }
};

vXmlReader.setEntityResolver(entityResolver);

InputSource vInputSource = new InputSource(new StringReader(vMostPlayedResponse));
Другие вопросы по тегам