2016-09-21 3 views
0

Ich verwende StaxEventItemReader in Spring Batch, um XML-Daten zu lesen und Java-Objekte zuzuordnen. Ich bin in der Lage, Elemente in XML erfolgreich zu wiederholen, aber das Problem ist, dass ich Header-Informationen aus meinem XML lesen möchte. Gibt es eine Möglichkeit oder Unterstützung von StaxEventItemReader zum Lesen von Header-Informationen.So lesen Sie Header-Informationen mit StaxEventItemReader im Frühjahr Stapel

<?xml version="1.0" encoding="UTF-8"?> 
<Contracts> 
    <TransactionInfo><Receiver> 
      <Code>CAT</Code> 
      <Name>CAT</Name> 
     </Receiver> 
     <SourceFile> 
      <FilePath>\\nft2a\ft$\transfer\EAD7SRR1.20160510_02363859.xml 
      </FilePath> 
      <FileName>EAD7SRR1.20160510_02363859.xml 
      </FileName> 
      <FileType>XML</FileType> 
      <FileTime>2016-05-10T02:36:41.337-07:00 
      </FileTime> 
     </SourceFile> 
    </TransactionInfo> 
    <Contract ContractID="Contract Rate Feed Test - LCL" 
     Carrier="DHL Danzas Air &amp; Ocean" TermBegin="2015-09-15" TermEnd="2016-09-14" 
     CarrierOrgID="20455"> 
     <LineItem ReferenceID="135516504144" Origin="Antwerp, BE" OriginCity="Antwerp" DestinationCity="Kpeme"> 
      <Surcharge Amount="25.0" Basis="BILLADING" Code="CUSTOM" Name="Document Turnover Fee" CurrencyCode="USD" /> 
      <Surcharge Amount="10.0" Basis="KILO" Code="CUSTOM" Name="Hazardous" CurrencyCode="USD" /> 
     </LineItem> 
     <LineItem ReferenceID="135516504145" Origin="Antwerp, BE"OriginCity="Antwerp" DestinationCity="Libreville"> 
      <Surcharge Amount="8.0" Basis="KILO" Code="CUSTOM" Name="Origin Handling" 
       CurrencyCode="USD" /> 
     </LineItem> 
    </Contract> 
    <Contract ContractID="Contract_1005_Test_LCL" 
     GTNContractID="66860" CarrierOrgID="20455"> 
     <LineItem ReferenceID="135516559003" Origin="Hong Kong, HK" DestinationCity="Hamburg"> 
      <Surcharge Amount="10.0" Basis="KILO" Code="ACD" Name="Arbitraries Charge (Destination)" CurrencyCode="USD" /> 
     </LineItem> 
    </Contract> 
</Contracts> 

Wie kann ich lesen TransactionInfo Meine Konfiguration

<bean id="contractReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
<property name="resource" value="classpath:sample-inputfile-srr-ocean.xml" /> 
    <property name="fragmentRootElementName" value="Contract" /> 
    <property name="unmarshaller"> 
     <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.cat.srr.gtn.domain.Contract</value> 
       </list> 
      </property> 
     </bean> 
    </property> 
</bean> 
<batch:job id="gtnContractJob"> 

    <batch:step id="step1" next="step2"> 
     <tasklet ref="ftpPullTask" /> 
    </batch:step> 

    <batch:step id="step2"> 
     <batch:tasklet transaction-manager="transactionManager"> 
      <batch:chunk reader="multiResourceReader" writer="contractWriter" 
       processor="contractProcessor" commit-interval="10" /> 
     </batch:tasklet> 
    </batch:step> 

    <batch:listeners> 
     <batch:listener ref="jobListener" /> 
    </batch:listeners> 
</batch:job> 

ist mir bitte helfen, wie ich Informationen über Feder Batch-Header lesen kann.

Antwort

0

Verwendung unter Eigenschaft StaxEventItemReader

fragmentRootElementNames

So sollte Ihr contractReader aussehen dieser

<bean id="contractReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
<property name="resource" value="classpath:sample-inputfile-srr-ocean.xml" /> 
    <property name="fragmentRootElementNames" value="TransactionInfo,Contract" /> 
    <property name="unmarshaller"> 
     <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.cat.srr.gtn.domain.Contract</value> 
<!-- Assumed that TransactionInfo is in same package as Contract --> 
        <value>com.cat.srr.gtn.domain.TransactionInfo</value> 
       </list> 
      </property> 
     </bean> 
    </property> 
</bean> 

Nun, wie es ist an Ihnen, in dem Prozessor zu behandeln

+0

Wie werden diese Objektwerte in Processor beca abgerufen? verwenden Prozessor kann nur 1 Objekt ItemProcessor ? – Sushil

+0

Sie können ItemProcessor und ItemWriter implementieren und darin können Sie steuern, was zu tun ist. Ein Composite-Item-Reader verfügt über Delegaten von ItemProcessor und ItemProcessor . Entscheide in ItemProcessor basierend auf dem Typ des Object-Aufrufs einer der ItemProcessor-Delegaten. –

+0

Ich habe versucht, Object in ItemProcessor (ItemProcessor ) zu verwenden, aber es funktioniert nicht. Kannst du mir bitte eine Probe für den Artikelprozessor für diesen Fall geben? ? Die Steuerung selbst kommt nicht zu ItemProcessor – Sushil

Verwandte Themen