Как пропустить проверку одного элемента jaxb, содержащегося в коллекции jaxb в Spring Batch Job? - PullRequest
1 голос
/ 24 октября 2011

Клиент отправляет 50 тыс. Клиентов в XML-файл. Я использую JaxBMarshaller * Spring Batch * и запускаю его в задании Spring Batch.

Пакетное задание Spring получает файл, обрабатывает и записывает.

Проблема в том, что это ВСЕ или НЕТ проверки с помощью jaxb. Если у меня есть 50 тыс. Объектов, и только 2 из них не прошли проверку, мне все равно нужно 49 998 объектов для обработки бизнесом.

Есть класс, javax.xml.bind.ValidationEventHandler; Вы можете установить его в JaxBMarshaller, но он возвращает только true или false и не предоставляет доступа к объекту, который маршалируется.

Я также добавил в Chunk Reader; ошибка по-прежнему выдает.

Пример схемы:

<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 Ответ

0 голосов
/ 24 октября 2011

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;
    }


}

Для получения дополнительной информации

...