如何通过实现 StreamingOutput 从休息服务创建和下载大数据集作为 CSV 文件

How to create and download large data set as CSV file from rest services by implementing StreamingOutput

我在数据库中有 20k 条记录,我需要通过从 rest 服务实现 StreamingOutput 将所有数据导出到 CSV 文件中。 我不知道如何实现 StreamingOutput 来下载 csv 文件。

请帮帮我..

提前致谢

您必须从数据库中读取记录,将每一行转换为 CSV 并使用类似以下内容才能使用 StreamingOutput:

package de.demo.services;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.*;

@Path( "/demo" )
public class DemoService
{
   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/api")
   public Response getCsv() {
       StreamingOutput stream = new StreamingOutput() {
          public void write(OutputStream os) throws ... {
             Writer writer = new BufferedWriter(new OutputStreamWriter(os));
             writer.write( /* CSV data */ );            
             writer.flush();
          }
       };

       return Response.ok(stream).build();
   }
}

注意不要一次从数据库中读取所有 20k 行,而是通过 JDBC 语句的方法 setFetchSize 基于游标读取结果。

在 Maven 中使用以下依赖项:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.23.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.23.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.23.1</version>
    </dependency>

Jersey 的 2.23.1 版本不是您可以获得的最新版本。

我正在使用相同的方法,就像你建议的那样,但控制不会只进入 StreamingOutput 实现。这是代码....

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/allEmployeeReport")
public Response exportAllEmployee()
{ 
   StreamingOutput stream = new  
   StreamingOutput() { 
      public void write(OutputStream os)
      throws IOException, Web...{
      Writer writer = new    
      BufferedWriter(new
     OutputStreamWriter(os));
      for(Employee employee : 
     repository.findAll()){
     writer.write(employee.getFName());
     writer.write(",");
     writer.write(employee.getLName());
     writer.write(",");
     writer.write(employee.getEmail()); 
      writer.write(",");
      writer.write(employee.getMobile());
     writer.write(",");
     writer.write(employee.getDOB());
     writer.write("\n");

     } 
    writer.flush();
     writer.close();
  }; 
  return Response.ok(stream).build(); 
 }