Skip to content

Luventas Web Design

A new blog for developers in PHP, Java and mobile Development

  • Home
  • 2011
  • September
  • 6
  • Textdateien mit Spring Batch erzeugen

Textdateien mit Spring Batch erzeugen

Posted on 6 September 2011 By luventas Keine Kommentare zu Textdateien mit Spring Batch erzeugen
Java, Spring

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

Der Reader:

Source code   
<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:

Source code   
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:

Source code   
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:

Source code   
<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.

Source code   
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.

Source code   
 

Print Friendly, PDF & Email

Beitrags-Navigation

❮ Previous Post: Create text files with spring batch
Next Post: How to make your Website texts nicer ❯

You may also like

Java
Secure data sending with sftp and spring batch
5 September 2011
Java
Daten sicher versenden mit SFTP und Spring Batch
5 September 2011
Java
Apache commons GenericObjectPool
8 Mai 2013
Java
Create text files with spring batch
6 September 2011

Schreibe einen Kommentar Antworten abbrechen

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

Copyright © 2023 Luventas Web Design.

Theme: Oceanly News by ScriptsTown

Diese Website nutzt Cookies, um bestmögliche Funktionalität bieten zu können. OK, verstanden
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
immer aktiv
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
SPEICHERN & AKZEPTIEREN