Exemple de lot de printemps - Fichier XML en fichier CSV

Exemple Spring Batch - Fichier XML en fichier CSV

Dans ce didacticiel, nous allons vous montrer comment configurer une tâche Spring Batch pour lire un fichier XML (bibliothèqueJAXB2) dans un fichiercsv et filtrer l'enregistrement avant d'écrire avecItemProcessor.

Outils et bibliothèques utilisés

  1. Maven 3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Spring Core 3.2.2.RELEASE

  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. Projet Java simple

1. Créez un projet Java de démarrage rapide avec Maven, convertissez et importez dans Eclipse IDE.

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

2. Dépendances du projet

Déclare toutes les dépendances de projet dans lespom.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. Structure du répertoire du projet

Passez en revue la structure finale du projet, obtenez un aperçu de ce qui se passera ensuite.

spring batch xml to csv

4. Fichier XML

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. Lire le fichier XML

Dans cet exemple, nous utilisonsJaxb2Marshaller pour mapper des valeurs et des attributs XML à un objet.

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

    
    
    
    
    
    

    
    
    
      
        com.example.model.Report
      
    
    

Annotez lesReport pour indiquer quelle valeur XML correspond à quel champ.

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());

    }

}

Dans JAXB2, les types de données «complexes» commeDate etBigDecimal ne seront pas automatiquement mappés au champ, même s'il est annoté.

Pour que JAXB2 prenne en charge la conversionDate, vous devez créer un adaptateur personnalisé pour gérer manuellement lesDate format, puis attacher l'adaptateur via@XmlJavaTypeAdapter.

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

}

Comme pourBigDecimal, les virgules "," dans l'élément de revenu du XML sont à l'origine du problème de conversion, vous avez besoin d'un adaptateur personnalisé pour le gérer également.

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. Réglage de base du lot de printemps

DéfinissezjobRepository etjobLauncher.

resources/spring/batch/config/context.xml



    
    
    
    

    


    
    
    

7. Emplois Spring Batch

Une tâche Spring batch, lisez le fichierreport.xml, mappez-le à l'objetReport et écrivez-le dans un fichier csv. Lisez les commentaires, cela devrait être explicite.

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



  
    
    
        
        
    
    
  

  
  

  
    
    
    
  

  
  
    
    
        com.example.model.Report
    
    
  

  
    
    
    

    
      
        
        
          
            
           
        
       
    
  

8. Spring Batch - ItemProcessor

Dans Spring batch, lesProcessor câblés seront déclenchés avant d'écrire dans des ressources, c'est donc le meilleur endroit pour gérer toute conversion, filtrage et logique métier. Dans cet exemple, l’objetReport sera ignoré (pas d’écriture dans le fichier csv) si son ’age est égal à 30.

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. Exécuter

La façon la plus simple d'exécuter un travail par lots.

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");

  }
}

Production. Les valeurs XML sont insérées dans un fichier csv.

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

Télécharger le code source

Téléchargez-le -SpringBatch-XML-CSV-Example.zip (81 kb)