Проблемы при попытке выбросить пользовательское исключение из пользовательского обработчика ошибок при проверке XML с StAX - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь реализовать пользовательское исключение при проверке XML против XSD, чтобы вернуть номер строки и элемент ошибки.

Однако, когда я генерирую свое собственное исключение в моем обработчике ошибок, SAXException генерируется с моим исключением, содержащимся в сообщении, а не с моей пользовательской ошибкой.

Когда мой CustomXMLValidationException добавлен в CustomErrorHandler - я бы хотел, чтобы его поймали в validateXml():

public static String validateXml(InputStream inputXml) throws XMLStreamException {
        try {
            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            javax.xml.validation.Validator validator = factory.newSchema(getXSD()).newValidator();
            XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(inputXml);
            validator.setErrorHandler(new CustomErrorHandler(reader));
            validator.validate(new StAXSource(reader));
        } catch (CustomXmlValidationException e) {
            return prepareValidationErrorMessageWithLineNo(e.getLineNo(), e.getMessage(), e.getElement());
        } catch (IOException | URISyntaxException | SAXException e) {
            return String.format("Validation error: ", e.getMessage());
        }
        return null;
    }

Вот CustomErrorHandler:

public class CustomErrorHandler implements ErrorHandler {

    private boolean isValid = true;

    public boolean isValid() {
        return this.isValid;
    }

    private XMLStreamReader reader;

    public CustomErrorHandler(XMLStreamReader reader) {
        this.reader = reader;
    }

    @Override
    public void error(SAXParseException exc) throws SAXException {
        throw new CustomXmlValidationException(exc.getMessage(), exc.getLineNumber(), reader.getLocalName());
    }

    @Override
    public void fatalError(SAXParseException exc) {

    }

    @Override
    public void warning(SAXParseException e) {

    }

А CustomXmlValidationException:

public class CustomXmlValidationException extends RuntimeException {

    int lineNo;
    String element;

    public CustomXmlValidationException(String message, int lineNo, String element) {
        super(message);
        this.lineNo = lineNo;
        this.element = element;
    }

    public int getLineNo() {
        return this.lineNo;
    }

    public String getElement() {
        return element;
    }
}
...