#xml #jaxb #spring-batch
#xml #jaxb #spring-batch
Вопрос:
Клиент отправляет 50 тыс. клиентов в XML-файле. Я использую JaxBMarshaller Spring Batch и запускаю пакетное задание Spring.
Пакетное задание Spring получает файл, обрабатывает и записывает.
Проблема в том, что проверка «ВСЕ или НИЧЕГО» с помощью jaxb. Если у меня 50 тыс. объектов, и только 2 из них не проходят проверку, мне все равно нужно 49 998 объектов для обработки бизнесом.
Есть класс javax.xml.bind .ValidationEventHandler; вы можете установить для него значение JaxBMarshaller, но он возвращает только true или false и не предоставляет доступа к маршалируемому объекту.
Я также добавил средство чтения фрагментов; ошибка по-прежнему выдается.
Пример схемы:
<xs:element name="CustomerLists">
<xs:complexType>
<xs:sequence>
<xs:element name="Customer" maxOccurs="unbounded" type="Customer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Пример Xml:
<a:CustomerLists xmlns:a="http://foo.com">
<a:Customer>
...
...
...
</a:Customer>
<a:Customer>
...
...
...
</a:Customer>
<a:Customer>
...
...
...
</a:Customer>
</a:CustomerLists>
Предложения?
Ответ №1:
Это javax.xml.bind.ValidationEventHandler
правильный механизм для использования с JAXB. Вы можете получить доступ к проблемному объекту для операции удаления с помощью ValidationEvent
:
package blog.jaxb.validation;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
public class MyValidationEventHandler implements ValidationEventHandler {
public boolean handleEvent(ValidationEvent event) {
System.out.println("nEVENT");
System.out.println("SEVERITY: " event.getSeverity());
System.out.println("MESSAGE: " event.getMessage());
System.out.println("LINKED EXCEPTION: " event.getLinkedException());
System.out.println("LOCATOR");
System.out.println(" OBJECT: " event.getLocator().getObject());
return true;
}
}
Для получения дополнительной информации
Комментарии:
1. event.getLocator().GetObject() возвращает значение NULL
2. @pritam — Для операции маршалирования или отмены маршалирования?
3. На самом деле это не отвечает на вопрос. Как мы МОЖЕМ ПРОПУСТИТЬ недопустимый элемент, чтобы продолжить обработку остальной части XML? У меня такая же проблема. Не похоже, что JAXB позволяет нам это делать.