Class StaxEventItemReader<T>

All Implemented Interfaces:
ResourceAwareItemReaderItemStream<T>, ItemReader<T>, ItemStream, ItemStreamReader<T>, org.springframework.beans.factory.Aware, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.InitializingBean

public class StaxEventItemReader<T> extends AbstractItemCountingItemStreamItemReader<T> implements ResourceAwareItemReaderItemStream<T>, org.springframework.beans.factory.InitializingBean
Item reader for reading XML input based on StAX.

It extracts fragments from the input XML document which correspond to records for processing. The fragments are wrapped with StartDocument and EndDocument events so that the fragments can be further processed like standalone XML documents.

The implementation is not thread-safe.

Author:
Robert Kasanicky, Mahmoud Ben Hassine, Glenn Renfro, Jimmy Praet
  • Field Details

    • DEFAULT_ENCODING

      public static final String DEFAULT_ENCODING
  • Constructor Details

    • StaxEventItemReader

      public StaxEventItemReader(org.springframework.oxm.Unmarshaller unmarshaller)
      Create a new StaxEventItemReader instance. The Unmarshaller must be provided to map XML fragments to objects.
      Parameters:
      unmarshaller - maps xml fragments corresponding to records to objects
      Since:
      6.0
  • Method Details

    • setStrict

      public void setStrict(boolean strict)
      In strict mode the reader will throw an exception on AbstractItemCountingItemStreamItemReader.open(ExecutionContext) if the input resource does not exist.
      Parameters:
      strict - true by default
    • setResource

      public void setResource(org.springframework.core.io.Resource resource)
      Specified by:
      setResource in interface ResourceAwareItemReaderItemStream<T>
    • setUnmarshaller

      public void setUnmarshaller(org.springframework.oxm.Unmarshaller unmarshaller)
      Parameters:
      unmarshaller - maps xml fragments corresponding to records to objects
    • setFragmentRootElementName

      public void setFragmentRootElementName(String fragmentRootElementName)
      Parameters:
      fragmentRootElementName - the name of the fragment's root element
    • setFragmentRootElementNames

      public void setFragmentRootElementNames(String[] fragmentRootElementNames)
      Parameters:
      fragmentRootElementNames - the names of the fragment's root element
    • setXmlInputFactory

      public void setXmlInputFactory(XMLInputFactory xmlInputFactory)
      Parameters:
      xmlInputFactory - to use
    • setEncoding

      public void setEncoding(String encoding)
      Set encoding to be used for the input file. Defaults to DEFAULT_ENCODING.
      Parameters:
      encoding - the encoding to be used. Can be null, in which case, the XML event reader will attempt to auto-detect the encoding from tht input file.
    • afterPropertiesSet

      public void afterPropertiesSet() throws Exception
      Ensure that all required dependencies for the ItemReader to run are provided after all properties have been set.
      Specified by:
      afterPropertiesSet in interface org.springframework.beans.factory.InitializingBean
      Throws:
      IllegalArgumentException - if the Resource, FragmentDeserializer or FragmentRootElementName is null, or if the root element is empty.
      IllegalStateException - if the Resource does not exist.
      Exception
      See Also:
      • InitializingBean.afterPropertiesSet()
    • moveCursorToNextFragment

      protected boolean moveCursorToNextFragment(XMLEventReader reader) throws NonTransientResourceException
      Responsible for moving the cursor before the StartElement of the fragment root.

      This implementation simply looks for the next corresponding element, it does not care about element nesting. You will need to override this method to correctly handle composite fragments.

      Parameters:
      reader - the XMLEventReader to be used to find next fragment.
      Returns:
      true if next fragment was found, false otherwise.
      Throws:
      NonTransientResourceException - if the cursor could not be moved. This will be treated as fatal and subsequent calls to read will return null.
    • doClose

      protected void doClose() throws Exception
      Description copied from class: AbstractItemCountingItemStreamItemReader
      Specified by:
      doClose in class AbstractItemCountingItemStreamItemReader<T>
      Throws:
      Exception - Allows subclasses to throw checked exceptions for interpretation by the framework
    • doOpen

      protected void doOpen() throws Exception
      Description copied from class: AbstractItemCountingItemStreamItemReader
      Open resources necessary to start reading input.
      Specified by:
      doOpen in class AbstractItemCountingItemStreamItemReader<T>
      Throws:
      Exception - Allows subclasses to throw checked exceptions for interpretation by the framework
    • doRead

      protected @Nullable T doRead() throws IOException, XMLStreamException
      Move to next fragment and map it to item.
      Specified by:
      doRead in class AbstractItemCountingItemStreamItemReader<T>
      Returns:
      an item or null if the data source is exhausted
      Throws:
      IOException
      XMLStreamException
    • jumpToItem

      protected void jumpToItem(int itemIndex) throws Exception
      Description copied from class: AbstractItemCountingItemStreamItemReader
      Move to the given item index. Subclasses should override this method if there is a more efficient way of moving to given index than re-reading the input using AbstractItemCountingItemStreamItemReader.doRead().
      Overrides:
      jumpToItem in class AbstractItemCountingItemStreamItemReader<T>
      Parameters:
      itemIndex - index of item (0 based) to jump to.
      Throws:
      Exception - Allows subclasses to throw checked exceptions for interpretation by the framework
    • isFragmentRootElementName

      protected boolean isFragmentRootElementName(QName name)