Spring Batch-Beispiel - XML-Datei in CSV-Datei

Spring Batch-Beispiel - XML-Datei in CSV-Datei

In diesem Tutorial zeigen wir Ihnen, wie Sie einen Spring Batch-Job so konfigurieren, dass eine XML-Datei (JAXB2 Bibliothek) in einecsv-Datei gelesen und der Datensatz herausgefiltert wird, bevor Sie mitItemProcessor schreiben.

Verwendete Tools und Bibliotheken

  1. Maven 3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Federkern 3.2.2.FREIGABE

  5. Spring Batch 2.2.0.RELEASE

  6. Spring OXM 3.2.2.RELEASE

P.S This example – XML file (reader) – filtering (itemProcessor) – CSV (writer).

1. Einfaches Java-Projekt

1. Erstellen Sie mit Maven ein Schnellstart-Java-Projekt, konvertieren und importieren Sie es in die Eclipse-IDE.

$ mvn archetype:generate -DgroupId=com.example -DartifactId=SpringBatchExample3
  -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
$ cd SpringBatchExample3/
$ mvn eclipse:eclipse

2. Projektabhängigkeiten

Deklariert alle Projektabhängigkeiten inpom.xml

pom.xml


    4.0.0
    com.example
    SpringBatchExample
    jar
    1.0-SNAPSHOT
    SpringBatchExample
    http://maven.apache.org

    
        1.6
        3.2.2.RELEASE
        2.2.0.RELEASE
    

    

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
        
            org.springframework
            spring-oxm
            ${spring.version}
        

        
        
            org.springframework.batch
            spring-batch-core
            ${spring.batch.version}
        
        
            org.springframework.batch
            spring-batch-infrastructure
            ${spring.batch.version}
        

    
    
        spring-batch
        
        
            org.apache.maven.plugins
            maven-eclipse-plugin
            2.9
            
                true
                false
            
        
        
            org.apache.maven.plugins
            maven-compiler-plugin
            2.3.2
            
                ${jdk.version}
                ${jdk.version}
            
        
        
    

3. Projektverzeichnisstruktur

Überprüfen Sie die endgültige Projektstruktur und verschaffen Sie sich einen Überblick über die nächsten Schritte.

spring batch xml to csv

4. XML-Datei

resources/xml/report.xml


    
        example
        31
        31/8/1982
        200,000
    
    
        kkwong
        30
        26/7/1983
        100,999
    
    
        joel
        29
        21/8/1984
        1,000,000
    
    
        leeyy
        29
        21/3/1984
        80,000.89
    

5. XML-Datei lesen

In diesem Beispiel verwenden wirJaxb2Marshaller, um XML-Werte und -Attribute einem Objekt zuzuordnen.

resources/spring/batch/jobs/job-report.xml

    
    
    
    
    
    

    
    
    
      
        com.example.model.Report
      
    
    

Kommentieren SieReport, um festzustellen, welcher XML-Wert welchem ​​Feld zugeordnet ist.

Report.java

package com.example.model;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.example.adapter.JaxbBigDecimalAdapter;
import com.example.adapter.JaxbDateAdapter;

@XmlRootElement(name = "record")
public class Report {

    private int refId;
    private String name;
    private int age;
    private Date dob;
    private BigDecimal income;

    @XmlAttribute(name = "refId")
    public int getRefId() {
        return refId;
    }

    public void setRefId(int refId) {
        this.refId = refId;
    }

    @XmlElement(name = "age")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlJavaTypeAdapter(JaxbDateAdapter.class)
    @XmlElement
    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }

    @XmlJavaTypeAdapter(JaxbBigDecimalAdapter.class)
    @XmlElement
    public BigDecimal getIncome() {
        return income;
    }

    public void setIncome(BigDecimal income) {
        this.income = income;
    }

    // for csv file only
    public String getCsvDob() {

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        return dateFormat.format(getDob());

    }

}

In JAXB2 werden diese "komplexen" Datentypen wieDate undBigDecimal dem Feld nicht automatisch zugeordnet, selbst wenn sie mit Anmerkungen versehen sind.

Damit JAXB2 die Konvertierung vonDateunterstützt, müssen Sie einen benutzerdefinierten Adapter erstellen, um dieDate format manuell zu verarbeiten, und dann den Adapter über@XmlJavaTypeAdapter anhängen.

JaxbDateAdapter.java

package com.example.adapter;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;


public class JaxbDateAdapter extends XmlAdapter {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

    @Override
    public String marshal(Date date) throws Exception {
        return dateFormat.format(date);
    }

    @Override
    public Date unmarshal(String date) throws Exception {
        return dateFormat.parse(date);
    }

}

Wie beiBigDecimal verursachen die Kommas "" im Einkommenselement des XML das Konvertierungsproblem. Sie benötigen einen benutzerdefinierten Adapter, um dies ebenfalls zu behandeln.

JaxbBigDecimalAdapter.java

package com.example.adapter;

import java.math.BigDecimal;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class JaxbBigDecimalAdapter extends XmlAdapter {

    @Override
    public String marshal(BigDecimal obj) throws Exception {
        return obj.toString();
    }

    @Override
    public BigDecimal unmarshal(String obj) throws Exception {
        return new BigDecimal(obj.replaceAll(",", ""));
    }

}

6. Federbatch-Kerneinstellung

Definieren SiejobRepository undjobLauncher.

resources/spring/batch/config/context.xml



    
    
    
    

    


    
    
    

7. Spring Batch-Jobs

Ein Spring-Batch-Job, lesen Sie die Dateireport.xml, ordnen Sie sie dem ObjektReportzu und schreiben Sie sie in eine CSV-Datei. Lies die Kommentare, es sollte selbsterklärend sein.

resources/spring/batch/jobs/job-report.xml



  
    
    
        
        
    
    
  

  
  

  
    
    
    
  

  
  
    
    
        com.example.model.Report
    
    
  

  
    
    
    

    
      
        
        
          
            
           
        
       
    
  

8. Spring Batch - ItemProcessor

Im Spring Batch werden die verkabeltenProcessor ausgelöst, bevor in Ressourcen geschrieben wird. Dies ist also der beste Ort, um Konvertierungs-, Filter- und Geschäftslogik zu verarbeiten. In diesem Beispiel wird dasReport-Objekt ignoriert (nicht in eine CSV-Datei geschrieben), wenn seinage gleich 30 ist.

FilterReportProcessor.java

package com.example.processor;

import org.springframework.batch.item.ItemProcessor;
import com.example.model.Report;

//run before writing
public class FilterReportProcessor implements ItemProcessor {

    @Override
    public Report process(Report item) throws Exception {

        //filter object which age = 30
        if(item.getAge()==30){
            return null; // null = ignore this object
        }
        return item;
    }

}

9. Starte es

Die einfachste Möglichkeit, einen Stapeljob auszuführen.

App.java

package com.example;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
  public static void main(String[] args) {

    String[] springConfig  =
    {
        "spring/batch/config/context.xml",
        "spring/batch/jobs/job-report.xml"
    };

    ApplicationContext context =
        new ClassPathXmlApplicationContext(springConfig);

    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    Job job = (Job) context.getBean("reportJob");

    try {

        JobExecution execution = jobLauncher.run(job, new JobParameters());
        System.out.println("Exit Status : " + execution.getStatus());

    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println("Done");

  }
}

Ausgabe. Die XML-Werte werden in eine CSV-Datei eingefügt.

csv/report.csv

1001,example,31,31/08/1982,200000
1003,joel,29,21/08/1984,1000000
1004,leeyy,29,21/03/1984,80000.89

output

Quellcode herunterladen

Laden Sie es herunter -SpringBatch-XML-CSV-Example.zip (81 kb)