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

时间:2018-01-30 16:54:01

标签: java rest web-services streaming export-to-csv

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

请帮帮我..

提前致谢

2 个答案:

答案 0 :(得分:0)

您必须从数据库中读取记录,将每行转换为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>

泽西岛的2.23.1版本不是您可以获得的最新版本。

答案 1 :(得分:0)

我正在使用相同的方法,就像你建议的那样,但是控制不仅仅在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(); 
 }