Java >> Java Tutorial >  >> Tag >> Spring

Spring Batch Tutorial:Lesen von Informationen aus einer XML-Datei

Im vorherigen Teil meines Spring Batch-Tutorials wurde beschrieben, wie Sie Informationen aus einer CSV-Datei lesen können. Dieses Mal lernen Sie, die Eingabedaten Ihres Spring Batch-Jobs aus einer XML-Datei auszulesen.

Nachdem Sie diesen Blogbeitrag gelesen haben, werden Sie:

  • Kann die Abhängigkeiten identifizieren, die erforderlich sind, wenn Sie die Eingabedaten Ihres Batch-Jobs aus einer XML-Datei lesen möchten.
  • Kann die erforderlichen Abhängigkeiten mit Maven und Gradle erhalten.
  • Verstehen Sie, wie Sie einen ItemReader konfigurieren können Bean, die die Eingabedaten Ihres Batch-Jobs aus einer XML-Datei liest.

Beginnen wir mit einem kurzen Blick auf die Beispielanwendung.

Einführung in die Beispielanwendung

In diesem Blogbeitrag lesen Sie die Eingabedaten Ihres Batch-Jobs aus einer XML-Datei, die die Studierendeninformationen eines Online-Kurses enthält. Genauer gesagt enthält die XML-Datei eine Schülerliste, die Ihrem Batch-Job die folgenden Informationen liefert:

  • Der Name des Schülers.
  • Die E-Mail-Adresse des Kursteilnehmers.
  • Der Name des gekauften Pakets.

Der Inhalt Ihrer Eingabedatei sieht wie folgt aus:

<students>
 <student>
 <name>Tony Tester</name>
 <emailAddress>[email protected]</emailAddress>
 <purchasedPackage>master</purchasedPackage>
 </student>
 <student>
 <name>Nick Newbie</name>
 <emailAddress>[email protected]</emailAddress>
 <purchasedPackage>starter</purchasedPackage>
 </student>
 <student>
 <name>Ian Intermediate</name>
 <emailAddress>[email protected]</emailAddress>
 <purchasedPackage>intermediate</purchasedPackage>
 </student>
</students>

Der ItemReader der die Studentenliste aus einer XML-Datei liest, muss StudentDTO zurückgeben Objekte. Der StudentDTO Klasse enthält die Informationen eines einzelnen Schülers und ihr Quellcode sieht wie folgt aus:

public class StudentDTO {

 private String emailAddress;
 private String name;
 private String purchasedPackage;

 public StudentDTO() {}

 public String getEmailAddress() {
 return emailAddress;
 }

 public String getName() {
 return name;
 }

 public String getPurchasedPackage() {
 return purchasedPackage;
 }

 public void setEmailAddress(String emailAddress) {
 this.emailAddress = emailAddress;
 }

 public void setName(String name) {
 this.name = name;
 }

 public void setPurchasedPackage(String purchasedPackage) {
 this.purchasedPackage = purchasedPackage;
 }
}

Als nächstes erhalten Sie die erforderlichen Abhängigkeiten mit Maven und Gradle.

Erforderliche Abhängigkeiten abrufen

Bevor Sie Informationen aus einer XML-Datei lesen können, müssen Sie die folgenden Abhängigkeiten abrufen:

  • Der spring-oxm Abhängigkeit hilft Ihnen, Objekte in XML-Dokumente zu serialisieren und XML-Dokumente in Objekte zu deserialisieren.
  • Der jaxb-api Abhängigkeit ermöglicht es Ihnen, Code zu kompilieren, der die JAXB-API verwendet, wenn Sie Java 11 oder neuer verwenden.
  • Der jaxb-runtime Abhängigkeit ermöglicht es Ihnen, eine Anwendung auszuführen, die die JAXB-API verwendet, wenn Sie Java 11 oder neuer verwenden.

Wenn Sie die Abhängigkeitsverwaltung von Spring Boot mit Maven verwenden, können Sie diese Abhängigkeiten erhalten, indem Sie die folgenden Abhängigkeitsdeklarationen zum dependencies hinzufügen Abschnitt Ihrer POM-Datei:

<dependency>
 <groupId>javax.xml.bind</groupId>
 <artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
 <groupId>org.glassfish.jaxb</groupId>
 <artifactId>jaxb-runtime</artifactId>
 <scope>runtime</scope>
</dependency>
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-oxm</artifactId>
</dependency>

Wenn Sie die Abhängigkeitsverwaltung von Spring Boot mit Gradle verwenden, können Sie diese Abhängigkeiten erhalten, indem Sie Ihrer build.gradle die folgenden Abhängigkeitsdeklarationen hinzufügen Datei:

dependencies {
 implementation(
 'javax.xml.bind:jaxb-api',
 'org.springframework:spring-oxm'
 )
 runtimeOnly(
 'org.glassfish.jaxb:jaxb-runtime'
 )
}

Machen wir uns auf den Weg und finden Sie heraus, wie Sie die Eingabedaten Ihres Batch-Jobs aus einer XML-Datei lesen können.

Lesen der Eingabedaten aus einer XML-Datei

Sie können die Eingabedaten für Ihren Batch-Job bereitstellen, indem Sie einen ItemReader konfigurieren Bohne. Da Sie die Schülerinformationen aus einer XML-Datei lesen müssen, müssen Sie diese Bean folgendermaßen konfigurieren:

Zuerst müssen Sie die Konfigurationsklasse erstellen, die die Beans enthält, die den Ablauf Ihres Batch-Jobs beschreiben. Der Quellcode Ihrer Konfigurationsklasse sieht wie folgt aus:

import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBatchExampleJobConfig {
}

Zweiter müssen Sie eine Methode erstellen, die Ihren ItemReader konfiguriert Bean und stellen Sie sicher, dass diese Methode einen ItemReader<StudentDTO> zurückgibt Objekt. Nachdem Sie diese Methode erstellt haben, sieht der Quellcode Ihrer Konfigurationsklasse wie folgt aus:

import org.springframework.batch.item.ItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBatchExampleJobConfig {

 @Bean
 public ItemReader<StudentDTO> itemReader() {
 
 }
}

Dritter , müssen Sie Ihren ItemReader konfigurieren Bean, indem Sie diesen Schritten folgen:

  1. Erstellen Sie einen neuen StaxEventItemReaderBuilder<StudentDTO> Objekt. Dieser Builder erstellt StaxEventItemReader<StudentDTO> Objekte, die die Eingabedaten aus einer XML-Datei lesen, indem sie StAX (die Streaming-API für XML) verwenden.
  2. Konfigurieren Sie den Namen des ItemReader .
  3. Konfigurieren Sie den Speicherort der XML-Datei, die die Eingabedaten Ihres Batch-Jobs enthält. Da ich eine möglichst einfach auszuführende Beispielanwendung erstellen wollte, habe ich darauf geachtet, dass die Eingabedatei (data/students.xml ) Ihres Batch-Jobs wird im Klassenpfad gefunden.
  4. Konfigurieren Sie den Namen des XML-Elements (student ), die die Informationen eines einzelnen Schülers enthält.
  5. Stellen Sie sicher, dass StaxEventItemReader<StudentDTO> -Objekt wandelt das verarbeitete XML-Fragment in einen StudentDTO um -Objekt mithilfe von JAXB2.
  6. Erstellen Sie einen neuen StaxEventItemReader<StudentDTO> Objekt und gibt das erstellte Objekt zurück.

Nachdem Sie Ihren ItemReader konfiguriert haben Bean sieht der Quellcode Ihrer Konfigurationsklasse wie folgt aus:

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;

@Configuration
public class SpringBatchExampleJobConfig {

 @Bean
 public ItemReader<StudentDTO> itemReader() {
 Jaxb2Marshaller studentMarshaller = new Jaxb2Marshaller();
 studentMarshaller.setClassesToBeBound(StudentDTO.class);

 return new StaxEventItemReaderBuilder<StudentDTO>()
 .name("studentReader")
 .resource(new ClassPathResource("data/students.xml"))
 .addFragmentRootElements("student")
 .unmarshaller(studentMarshaller)
 .build();
 }
}

Vor Ihrem ItemReader Bean kann die aus der student.xml gelesenen Schülerinformationen umwandeln Datei in StudentDTO -Objekte müssen Sie den Namen des Fragment-Root-Elements im StudentDTO konfigurieren Klasse. Wir können dies tun, indem wir diesen Schritten folgen:

  1. Kommentieren Sie die Klasse mit dem @XmlRootElement Anmerkung.
  2. Konfigurieren Sie den Namen des Root-Elements, indem Sie den Wert von @XmlRootElement festlegen name der Anmerkung Attribut zu:'Student'.

Nachdem Sie diese Änderung an StudentDTO vorgenommen haben Klasse sieht der Quellcode wie folgt aus:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="student")
public class StudentDTO {

 private String emailAddress;
 private String name;
 private String purchasedPackage;

 public StudentDTO() {}

 public String getEmailAddress() {
 return emailAddress;
 }

 public String getName() {
 return name;
 }

 public String getPurchasedPackage() {
 return purchasedPackage;
 }

 public void setEmailAddress(String emailAddress) {
 this.emailAddress = emailAddress;
 }

 public void setName(String name) {
 this.name = name;
 }

 public void setPurchasedPackage(String purchasedPackage) {
 this.purchasedPackage = purchasedPackage;
 }
}

Sie können nun die Eingabedaten Ihres Batch-Jobs aus einer XML-Datei auslesen. Fassen wir zusammen, was Sie aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat Ihnen fünf Dinge beigebracht:

  • Der spring-oxm Abhängigkeit hilft Ihnen, Objekte in XML-Dokumente zu serialisieren und XML-Dokumente in Objekte zu deserialisieren.
  • Der jaxb-api Abhängigkeit ermöglicht es Ihnen, Code zu kompilieren, der die JAXB-API verwendet, wenn Sie Java 11 oder neuer verwenden.
  • Der jaxb-runtime Abhängigkeit ermöglicht es Ihnen, eine Anwendung auszuführen, die die JAXB-API verwendet, wenn Sie Java 11 oder neuer verwenden.
  • Sie können die Eingabedaten Ihres Batch-Jobs aus einer XML-Datei lesen, indem Sie den StaxEventItemReader<T> verwenden Klasse.
  • Sie müssen den Namen des Fragmentstammelements konfigurieren, indem Sie Ihre DTO-Klasse mit @XmlRootElement annotieren Anmerkung.

Der nächste Teil meines Spring Batch-Tutorials beschreibt, wie Sie die Eingabedaten Ihres Batch-Jobs aus einer relationalen Datenbank lesen können.


Java-Tag