Как пропустить проверку одного элемента jaxb, содержащегося в коллекции jaxb, в пакетном задании Spring?

#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 позволяет нам это делать.