春のバッチの例 - CSVファイルへのXMLファイル

Spring Batchの例– XMLファイルからCSVファイル

このチュートリアルでは、XMLファイル(JAXB2ライブラリ)をcsvファイルに読み込み、ItemProcessorで書き込む前にレコードをフィルターで除外するようにSpringBatchジョブを構成する方法を示します。

使用するツールとライブラリ

  1. メーベン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. シンプルなJavaプロジェクト

1. MavenでクイックスタートJavaプロジェクトを作成し、変換して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では、DateBigDecimalのような「複雑な」データ型は、注釈が付けられていても、フィールドに自動的にマップされません。

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. Spring Batchコア設定

jobRepositoryjobLauncherを定義します。

resources/spring/batch/config/context.xml



    
    
    
    

    


    
    
    

7. 春のバッチジョブ

Springバッチジョブ。report.xmlファイルを読み取り、それをReportオブジェクトにマップして、csvファイルに書き込みます。 コメントを読んでください、それは自明であるべきです。

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



  
    
    
        
        
    
    
  

  
  

  
    
    
    
  

  
  
    
    
        com.example.model.Report
    
    
  

  
    
    
    

    
      
        
        
          
            
           
        
       
    
  

8. Spring Batch – ItemProcessor

Springバッチでは、有線のProcessorはリソースに書き込む前に起動されるため、変換、フィルタリング、ビジネスロジックを処理するのに最適な場所です。 この例では、ageが30に等しい場合、Reportオブジェクトは無視されます(csvファイルに書き込まれません)。

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 kb)