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 |
|
@ToString |
|
@NoArgsConstructor |
|
@RequiredArgsContructor |
|
@AllArgsConstructor |
|
@Data |
|
@Builder |
|
@Value |
|
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 enFaker
objekt under applikationens opstart og vil automatisk blive injiceret i applikationenResidentRepository.java
– Repository interface, der udviderCrudRepository
interface til at udføre SQL-handlingerneResidentService.java
– Serviceklasse, der giver nogle forretningsfaciliteter og interagerer med DAO-lagmetoderneDefaultResidentsLoader.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