Пример Spring Batch - XML-файл в CSV-файл

Пример Spring Batch - XML-файл в CSV-файл

В этом руководстве мы покажем вам, как настроить задание Spring Batch для чтения файла XML (библиотекаJAXB2) в файлcsv и отфильтровать запись перед записью с помощьюItemProcessor.

Использованные инструменты и библиотеки

  1. Maven 3

  2. Затмение 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. Простой Java-проект

1. Создайте проект Java для быстрого запуска с помощью Maven, конвертируйте и импортируйте в Eclipse IDE.

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

2. Зависимости проекта

Объявляет все зависимости проекта вpom.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. Структура каталога проекта

Просмотрите окончательную структуру проекта, получите представление о том, что будет дальше.

spring batch xml to csv

4. 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. Читать XML-файл

В этом примере мы используемJaxb2Marshaller для сопоставления значений и атрибутов XML с объектом.

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

    
    
    
    
    
    

    
    
    
      
        com.example.model.Report
      
    
    

Добавьте аннотации кReport, чтобы указать, какое значение XML соответствует какому полю.

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

    }

}

В JAXB2 такие «сложные» типы данных, какDate иBigDecimal, не будут автоматически отображаться в поле, даже если оно аннотировано.

Чтобы JAXB2 поддерживал преобразованиеDate, вам нужно создать собственный адаптер для обработкиDate format вручную, а затем подключить адаптер через@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);
    }

}

Как иBigDecimal, запятые «,» в элементе дохода XML вызывают проблему с преобразованием, вам также понадобится специальный адаптер, чтобы справиться с этим.

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. Настройка основной партии пружин

ОпределитеjobRepository иjobLauncher.

resources/spring/batch/config/context.xml



    
    
    
    

    


    
    
    

7. Весенние партии рабочих мест

Пакетное задание Spring: прочтите файлreport.xml, сопоставьте его с объектомReport и запишите его в файл csv. Прочитайте комментарии, это должно быть само за себя.

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



  
    
    
        
        
    
    
  

  
  

  
    
    
    
  

  
  
    
    
        com.example.model.Report
    
    
  

  
    
    
    

    
      
        
        
          
            
           
        
       
    
  

8. Весенняя партия - ItemProcessor

В пакете Spring зашитыеProcessor будут запущены перед записью в какие-либо ресурсы, поэтому это лучшее место для обработки любого преобразования, фильтрации и бизнес-логики. В этом примере объектReport будет проигнорирован (не записан в файл csv), если его ’age равен 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. Запустить его

Самый простой способ запустить пакетное задание.

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

  }
}

Выход. Значения XML вставляются в файл 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

Скачать исходный код

Скачать -SpringBatch-XML-CSV-Example.zip (81 кб)