Textdateien mit Spring Batch erzeugen

Wir wollen eine Datei über Spring batch erzeugen. Hierfür benötigen wir einen Marshaller mir „Reader“ und „Writer“.

Der Reader:

<bean id="fileReader">
  <property name="dataSource" ref="dataSource" />
  <property name="sql" value="SELECT * FROM table" />
  <property name="rowMapper">
    <bean class="de.package.rowmapper.FileRowMapper" />
  </property>
</bean>

Der RowMapper, welcher vom Reader verwendet wird:

package de.package.rowmapper;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.RowMapper;
import de.package.domainObjects.SftpFileObject;
 
public class FileRowMapper implements RowMapper {
 
  public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    FileLineObject fileLine = new FileLineObject();
    try {
      fileLine.setDbField1(rs.getString("dbField1"));
      fileLine.setDbField2(rs.getString("dbField2"));
      fileLine.setDbField3(rs.getString("dbField3"));
      fileLine.setDbField4(rs.getString("dbField4"));
      fileLine.setDbField5(rs.getString("dbField5"));
    } catch (SQLException e) {
      System.out.println("Can't create data row for export File.");
    }
    return fileLine;
  }
}

Das DomainObject, welches über den RowMapper vom Reader befüllt wird:

package de.package.domainObjects;
 
public class FileLineObject implements java.io.Serializable {
 
  private static final long serialVersionUID = 1L;
 
  public String dbField1;
  public String dbField2;
  public String dbField3;
  public String dbField4;
  public String dbField5;
 
  public String getDbField1() {
    return dbField1;
  }
 
  public void setDbField1(String dbField1) {
    this.dbField1= dbField1;
  }
 
  public String getDbField2() {
    return dbField2;
  }
 
  public void setDbField2(String dbField2) {
    this.dbField2= dbField2;
  }
 
  public String getDbField3() {
    return dbField3;
  }
 
  public void setDbField3(String dbField3) {
    this.dbField3= dbField3;
  }
 
  public String getDbField4() {
    return dbField4;
  }
 
  public void setDbField4(String dbField4) {
    this.dbField4= dbField4;
  }
 
  public String getDbField5() {
    return dbField5;
  }
 
  public void setDbField5(String dbField5) {
    this.dbField5= dbField5;
  }
}

Der Writer:

<bean id="fileWriter" scope="step">
  <property name="resource" value="file:path/to/file/filename.csv" />
  <property name="encoding" value="ISO-8859-1" />
  <property name="headerCallback">
    <bean class="de.package.helper.HeaderCallback" />
  </property>
  <property name="lineAggregator">
    <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
      <property name="delimiter" value=";" />
      <property name="fieldExtractor">
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
          <property name="names" value="dbField1, dbField2, dbField3, dbField4, dbField5" />
        </bean>
      </property>
    </bean>
  </property>
</bean>

Den HeaderCallback benötigen wir nur, wenn wir in der Datei eine Kopfzeile verwenden wollen, welche nicht vom Reader geliefert wird. Wenn wir diese Zeile haben wollen, müssen wir folgende kleine JavaKlasse verwenden, welche die Zeile in die Datei einfügt.
Es gibt außerdem noch die Möglichkeit, einen FooterCallback zu verwenden, um Zeilen an das ende der Datei anzuhängen, wenn der RowMapper seine Arbeit getan hat. Im meinem Beispiel gehe ich aber nicht weiter darauf ein.

package de.package.helper;
 
import java.io.IOException;
import java.io.Writer;
import org.springframework.batch.item.file.FlatFileHeaderCallback;
 
public class HeaderCallback implements FlatFileHeaderCallback {
 
  @Override
  public void writeHeader(Writer writer) throws IOException {
    writer.write("FieldHeadline1;FieldHeadline2;FieldHeadline3;FieldHeadline4;FieldHeadline5");
  }
}

Diese Beans zusammen können nun über einen BatchJob aufgerufen werden.

 

Print Friendly, PDF & Email

Leave a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*
*