Java >> Java tutorial >  >> Tag >> Spring

Spring Boot Download eksempel på CSV-fil

Velkommen, i denne tutorial vil vi se, hvordan man downloader en CSV-fil i et spring boot-program. Vi vil bruge postbudsværktøjet til at se CSV-dataene, men du er fri til at forbedre ved at tilføje en simpel HTML-side, der indeholder et link til at downloade CSV'en.

1. Introduktion

Før vi går videre i denne vejledning, vil vi se på den almindelige terminologi, såsom introduktion til Spring Boot og Lombok.

1.1 fjederstøvle

  • Forårsstøvle er et modul, der giver en hurtig applikationsudviklingsfunktion til fjederrammerne inklusive automatisk konfiguration , standalone-kode , og produktionsklar kode
  • Den opretter applikationer, der er pakket som jar og startes direkte ved hjælp af indlejret servletbeholder (såsom Tomcat, Jetty eller Undertow). Det er således ikke nødvendigt at implementere krigen filer
  • Det forenkler maven-konfigurationen ved at levere startskabelonen og hjælper med at løse afhængighedskonflikterne. Den identificerer automatisk de nødvendige afhængigheder og importerer dem til applikationen
  • Det hjælper med at fjerne boilerplate-koden, ekstra annoteringer og XML-konfigurationer
  • Det giver kraftfuld batchbehandling og administrerer resten af ​​slutpunkterne
  • Det giver et effektivt JPA-starter-bibliotek for effektivt at forbinde applikationen med relationsdatabaserne
  • Det tilbyder en mikroservicearkitektur og cloud-konfiguration, der administrerer alle de applikationsrelaterede konfigurationsegenskaber på en centraliseret måde

1.2 Lombok

  • Lombok er intet andet end et lille bibliotek, der reducerer mængden af ​​standard Java-kode fra projektet
  • Genererer automatisk gettere og sættere for objektet ved at bruge Lombok-annoteringerne
  • Hooks ind via Annotation Processor API
  • Rå kildekode sendes til Lombok til kodegenerering, før Java-kompileren fortsætter. Producerer således korrekt kompileret Java-kode i forbindelse med Java Compiler
  • Under target/classes mappe kan du se de kompilerede klassefiler
  • Kan bruges med Maven, Gradle IDE osv.

1.2.1 Lombok-funktioner

Funktion Detaljer
val Lokale variable er erklæret som final
var Foranderlige lokale variabler
@Slf4J Opretter en SLF4J-logger
@Cleanup Vil ringe til close() på ressourcen i finally blokere
@Getter Opretter getter-metoder for alle egenskaber
@Setter Opretter setter for alle ikke-endelige egenskaber
@EqualsAndHashCode
  • Genererer implementeringer af equals(Object other) og hashCode()
  • Bruger som standard alle ikke-statiske, ikke-forbigående egenskaber
  • Kan valgfrit ekskludere specifikke egenskaber
@ToString
  • Genererer streng af klassenavn og hvert felt adskilt af kommaer
  • Valgfri parameter til at inkludere feltnavne
  • Valgfri parameter for at inkludere et opkald til super toString metode
@NoArgsConstructor
  • Genererer no-args-konstruktør
  • Vil forårsage kompileringsfejl, hvis der er endelige felter
  • Kan valgfrit forcere, hvilket vil initialisere endelige felter med 0/false/null var – mutable lokale variabler
@RequiredArgsContructor
  • Genererer en konstruktør for alle felter, der er final eller markeret med @NonNull
  • Konstruktøren vil kaste en NullPointerException hvis nogen @NonNull felter er null val - lokale variabler er deklareret final
@AllArgsConstructor
  • Genererer en konstruktør for alle egenskaber i klassen
  • Enhver @NotNull egenskaber vil have nul-tjek
@Data
  • Genererer typisk kedelkode for POJO'er
  • Kombinerer – @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor
  • Der genereres ingen konstruktør, hvis konstruktører eksplicit er blevet erklæret
@Builder
  • Implementerer Builder mønster til oprettelse af objekter
@Value
  • Den uforanderlige variant af @Data
  • Alle felter er lavet private og final som standard

Lad os gå videre med implementeringen af ​​selvstudiet, men før jeg går videre, antager jeg, at du er klar over det grundlæggende i forårets støvler.

2. Spring Boot Download eksempel på CSV-fil

2.1 Værktøjer brugt til Spring boot-applikation og projektstruktur

Vi bruger Eclipse Kepler SR2, JDK 8 og Maven. Hvis du er i tvivl om, hvor du skal oprette de tilsvarende filer eller mapper, så lad os gennemgå projektstrukturen for forårsstartapplikationen.

Lad os begynde at bygge applikationen!

3. Oprettelse af en Spring Boot-applikation

Nedenfor er de trin, der er involveret i udviklingen af ​​applikationen.

3.1 Maven Dependency

Her specificerer vi afhængigheden for Spring boot (Web og JPA), Common Csv, H2 database, Java Faker og Lombok. Den opdaterede fil vil have følgende kode.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springboot.downloadcsv</groupId>
    <artifactId>DownloadCsvInSpringboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>DownloadCsvInSpringboot</name>
    <description>Download csv in springboot application</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>com.github.javafaker</groupId>
            <artifactId>javafaker</artifactId>
            <version>1.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3.2 Programegenskabsfil

Opret en ny egenskabsfil på placeringen:DownloadCsvInSpringboot/src/main/resources/ og tilføje følgende kode til det. Her vil vi definere H2-databaseforbindelsen, databaseoprettelse og h2-konsoldetaljer. Du kan frit ændre applikationen eller databasedetaljerne efter dit ønske.

application.properties

server.port=9800
spring.application.name=downloadcsv-in-springboot
# h2 database settings
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
# db-creation settings
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.show_sql=true
## browser url for h2 console - http://localhost:9800/h2-console
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

3.3 Java-klasser

Lad os skrive de vigtige java-klasser, der er involveret i denne applikation. For kortheds skyld springer vi de følgende klasser over –

  • FakerConfig.java – Konfigurationsklassen indeholder en @Bean annoteret metode, der opretter en Faker objekt under applikationens opstart og vil automatisk blive injiceret i applikationen
  • ResidentRepository.java – Repository interface, der udvider CrudRepository interface til at udføre SQL-handlingerne
  • ResidentService.java – Serviceklasse, der giver nogle forretningsfaciliteter og interagerer med DAO-lagmetoderne
  • DefaultResidentsLoader.java – Bootstrap-klasse til at udfylde dummy-data til h2-databasen, når applikationen er startet. Du kan bruge /API/get-residents slutpunkt til at hente beboere i JSON-format eller kan se dataene direkte via h2-konsollen tilgængelig på – http://localhost:9800/h2-console

3.3.1 Implementering/Hovedklasse

Tilføj følgende kode til hovedklassen for at bootstrap programmet fra hovedmetoden. Husk altid, at indgangspunktet for spring boot-applikationen er klassen, der indeholder @SpringBootApplication annotation og den statiske hovedmetode.

DownloadCsvInSpringbootApplication.java

package com.springboot.downloadcsv;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//lombok annotation
@Slf4j
//spring annotation
@SpringBootApplication
public class DownloadCsvInSpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(DownloadCsvInSpringbootApplication.class, args);
        log.info("Download csv in springboot application started successfully");
    }
}

3.3.2 Enhedsklasse

Tilføj følgende kode til enhedsklassen, og klassen vil blive kommenteret med Spring JPA- og Lombok-annoteringerne.

Resident.java

package com.springboot.downloadcsv.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import javax.persistence.*;
import java.time.LocalDate;

//spring jpa annotations
@Entity
@Table(name = "resident")
//lombok annotations
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
//spring annotation
@Component
public class Resident {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    int id;
    @Column(name = "full_name", nullable = false)
    String fullName;
    int age;
    String gender;
    @Column(name = "phone_number", unique = true)
    String phoneNumber;
    @Column(name = "email_address", nullable = false, unique = true)
    String emailAddress;
    @Column(name = "date_of_birth")
    LocalDate dateOfBirth;
    @Column(name = "home_address")
    String homeAddress;
    String nationality;
}

3.3.3 CSV-tjenesteklasse

Tilføj følgende kode til CSV-tjenesteklassen, hvor load() metoden accepterer residents liste som et input-argument og skriv posterne til ByteArrayInputStream strøm.

CsvService.java

package com.springboot.downloadcsv.service;

import com.springboot.downloadcsv.entity.Resident;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.stereotype.Service;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;

//lombok annotation
@Slf4j
//spring annotation
@Service
public class CsvService {

    private static final String[] HEADERS = {"Id", "Full name", "Age", "Gender", "Phone number",
            "Email address", "Date of birth", "Home address", "Nationality"};
    private static final CSVFormat FORMAT = CSVFormat.DEFAULT.withHeader(HEADERS);

    //load data into csv
    public ByteArrayInputStream load(final List<Resident> residents) {
        return writeDataToCsv(residents);
    }

    //write data to csv
    private ByteArrayInputStream writeDataToCsv(final List<Resident> residents) {
        log.info("Writing data to the csv printer");
        try (final ByteArrayOutputStream stream = new ByteArrayOutputStream();
             final CSVPrinter printer = new CSVPrinter(new PrintWriter(stream), FORMAT)) {
            for (final Resident resident : residents) {
                final List<String> data = Arrays.asList(
                        String.valueOf(resident.getId()),
                        resident.getFullName(),
                        String.valueOf(resident.getAge()),
                        resident.getGender(),
                        resident.getPhoneNumber(),
                        resident.getEmailAddress(),
                        String.valueOf(resident.getDateOfBirth()),
                        resident.getHomeAddress(),
                        resident.getNationality());

                printer.printRecord(data);
            }

            printer.flush();
            return new ByteArrayInputStream(stream.toByteArray());
        } catch (final IOException e) {
            throw new RuntimeException("Csv writing error: " + e.getMessage());
        }
    }
}

3.3.4 Controllerklasse

Tilføj følgende kode til controllerklassen. Klassen injiceres med Resident-servicelagsafhængigheden for at kalde DAO-lagmetoderne og CSV-serviceafhængigheden for at forberede dataene og returnere en ByteArrayInputStream stream til videre brug.

CsvController.java

package com.springboot.downloadcsv.controller;

import com.springboot.downloadcsv.entity.Resident;
import com.springboot.downloadcsv.service.CsvService;
import com.springboot.downloadcsv.service.ResidentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

//note - for simplicity we have removed the ui configuration.
//you're free to add the code changes for the ui (thymeleaf configuration).

//lombok annotation
@Slf4j
//spring annotations
@RestController
@RequestMapping("/api")
public class CsvController {

    @Autowired
    ResidentService service;
    @Autowired
    CsvService csvService;

    //get all residents from db
    //URL - http://localhost:9800/api/get-residents
    @GetMapping("/get-residents")
    @ResponseStatus(HttpStatus.OK)
    public List<Resident> getResidents() {
        log.info("Get all residents");
        return service.getResidents();
    }

    // download all residents info from db
    //URL - http://localhost:9800/api/download-residents-csv
    //note - incoming request to contain the mandatory "Content-disposition" and "Content-Type" headers
    @GetMapping("/download-residents-csv")
    public ResponseEntity<Resource> getCsv(
            @RequestHeader(name = "Content-disposition") final String fileName,
            @RequestHeader(name = "Content-Type") final String mediaType) {
        log.info("Downloading residents csv");
        final List<Resident> residents = service.getResidents();
        final InputStreamResource resource = new InputStreamResource(csvService.load(residents));
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, fileName)
                .contentType(MediaType.parseMediaType(mediaType))
                .body(resource);
    }
}

4. Kør programmet

For at køre programmet skal du højreklikke på DownloadCsvInSpringbootApplication.java klasse, Run As -> Java Application .

6. Projektdemo

Når applikationen er startet, skal du åbne Postman-værktøjet for at ramme applikationens slutpunkter for enten at hente dataene fra DB'en og returnere i et JSON-format eller for at downloade dataene i et CSV-format.

Applikationsslutpunkter

-- HTTP GET endpoint (get all residents from db in json format) –
http://localhost:9800/api/get-residents

-- HTTP GET endpoint (to download the data in CSV format) –
-- note - incoming request to contain the mandatory "Content-disposition" and "Content-Type" headers --
http://localhost:9800/api/download-residents-csv

Det er alt for denne tutorial, og jeg håber, at artiklen tjente dig, hvad end du ledte efter. God læring og glem ikke at dele!

7. Resumé

I dette afsnit lærte du

  • Forårsstøvle og Lombok-introduktion
  • Trin til at downloade dataene i CSV i et spring boot-program

Du kan downloade eksempelapplikationen som et Eclipse-projekt i afsnittet Downloads.

8. Download projektet

Dette var et eksempel på download af data i en CSV i en fjederstøvleapplikation.CSV fjederstøvle

Java tag