Я пишу код для демонтажа XML из файла.Я не знаю заранее, на какой схеме основан XML, поэтому я пытаюсь разобрать его с помощью нескольких схем в виде различных экземпляров Jaxb2Marshaller.
Метод должен:
- попытка разархивировать XML с каждым маршаллером
- Если это удастся, вернуть полученный объект
- Если не получится, попробуйте следующий маршаллер
- Если все маршаллеры не пройдены, выведитеисключение с последним сообщением об ошибке
Вот текущий код:
private Object getObject(final byte[] data) throws MyException {
String lastErrorMessage = "";
for (final Jaxb2Marshaller marshaller : this.marshallers) {
try {
return marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data)));
} catch (final XmlMappingException e) {
LOGGER.warn("Invalid XML", e);
lastErrorMessage = e.getMessage();
}
}
throw new MyException(lastErrorMessage);
}
Мне кажется, что этот метод делает слишком много вещей на разных уровнях абстракции:
- перебрать маршаллеры
- применить маршаллер
- результат возврата
- перехват исключений
- исключение выброса
Но яне вижу способа упростить это.Блок try-catch необходим для каждого маршаллера (потому что я должен ловить и игнорировать эти исключения XmlMappingException, кроме последнего).Этот блок либо возвращает объект результата, либо lastErrorMessage, который необходим ниже итерации для выброса MyException.
Единственное решение, которое я могу придумать, - это создать какой-то придуманный класс Result, который содержит либо объект результата, либосообщение об ошибке, но это кажется грязным.Любые другие идеи?