2012-09-10 4 views
2

나는 내가 SuperCSV 라이브러리를 사용하여 콩의 집합에서 CSV를 생성하기 위해 호출하는 나의 봄 컨트롤러에 대해 생성하는 유틸리티 클래스가 (http://supercsv.sourceforge.net/)SuperCSV에서 읽을 수없는 출력이 있습니까?

유틸리티 클래스는 아주 기본입니다 :

public static void export2CSV(HttpServletResponse response, 
     String[] header, String filePrefix, List<? extends Object> dataObjs) { 
    try{ 
     response.setContentType("text/csv;charset=utf-8"); 
     response.setHeader("Content-Disposition","attachment; filename="+filePrefix+"_Data.csv"); 

     OutputStream fout= response.getOutputStream(); 
     OutputStream bos = new BufferedOutputStream(fout); 
     OutputStreamWriter outputwriter = new OutputStreamWriter(bos); 

     ICsvBeanWriter writer = new CsvBeanWriter(outputwriter, CsvPreference.EXCEL_PREFERENCE); 

     // the actual writing 
     writer.writeHeader(header); 

     for(Object anObj : dataObjs){ 
      writer.write(anObj, header);         
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
}; 

캐치는, 나는이 가동에서 다른 행동을 얻고있다 그리고 나는 왜 모른다. 한 컨트롤러에서 호출하면 ('A'라고 부름) 데이터의 예상 출력을 얻습니다.

다른 컨트롤러 ('B')에서 호출하면 OO Calc에서 열 수없는 인식 할 수없는 바이너리 데이터가 표시됩니다. 메모장 ++에서 열면 읽을 수없는 횡설수설 줄이 생겨 독자가 나에게 이진 스트림을 보여주기위한 시도라고 가정 할 수 있습니다.

컨트롤러 'A'호출 (작동 한) 여기

@RequestMapping(value="/getFullReqData.html", method = RequestMethod.GET) 
public void getFullData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    logger.info("INFO: ******************************Received request for full Req data dump"); 
    String projName= (String)session.getAttribute("currentProject"); 
    int projectID = ProjectService.getProjectID(projName); 
    List<Requirement> allRecords = reqService.getFullDataSet(projectID); 

     final String[] header = new String[] { 
       "ColumnA", 
       "ColumnB",     
       "ColumnC", 
       "ColumnD", 
       "ColumnE" 
       }; 

     CSVExporter.export2CSV(response, header, projName+"_reqs_", allRecords); 


}; 

... 그리고 컨트롤러 'B'호출 (실패 일)입니다 :

@RequestMapping(value="/getFullTCData.html", method = RequestMethod.GET) 
public void getFullData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    logger.info("INFO: Received request for full TCD data dump"); 
    String projName= (String)session.getAttribute("currentProject"); 
    int projectID = ProjectService.getProjectID(projName); 
    List<TestCase> allRecords = testService.getFullTestCaseList(projectID); 

    final String[] header = new String[] { 
      "ColumnW", 
      "ColumnX", 
      "ColumnY",     
      "ColumnZ" 
     }; 

    CSVExporter.export2CSV(response, header, projName+"_tcs_", allRecords); 
} 

관찰 :

  • 내가 처음에 호출 한 컨트롤러는 관계가 없습니다. 'A'는 항상 작동하고 'B'는 항상 횡설수설을 산출합니다.
  • 이 함수를 호출 할 때마다 CSVWriter에 전달되는 Bean에 정의 된 전체 작업 집합의 하위 집합 인 헤더 열 목록이 있습니다
  • 예외 printStackTrace는 빈의 리플렉션 필드가 정의와 일치하지 않을 때 (즉, 프로그래밍 방식으로 값을 가져 오기 위해 get()을 찾을 수 없음) 모든 열/변수 matchup이 성공했음을 감지 할 때 작동합니다. 디버거에서
  • , 나는가 Writer.write을 확인한 (객체, 헤더) 호출 전달되는 개체의 수에 따라 시간의 예상 번호를 쳐서되고 이러한 개체는 예상 데이터를 가지고

제안이나 통찰력이 있으면 크게 감사하겠습니다. 나는 그 문제를 더 잘 분리하는 방법을 정말로 잘 모르겠다. ...

+0

작가를 종료 하시겠습니까? –

답변

2

당신은 작가를 닫지 않고있다. 또한 CsvBeanWriter는 BufferedWriter에 작성자를 래핑하므로 outputwriter도 단순화 할 수 있습니다.

public static void export2CSV(HttpServletResponse response, 
     String[] header, String filePrefix, List<? extends Object> dataObjs) { 
    ICsvBeanWriter writer; 
    try{ 
     response.setContentType("text/csv;charset=utf-8"); 
     response.setHeader("Content-Disposition", 
      "attachment; filename="+filePrefix+"_Data.csv"); 

     OutputStreamWriter outputwriter = 
      new OutputStreamWriter(response.getOutputStream()); 

     writer = new CsvBeanWriter(outputwriter, CsvPreference.EXCEL_PREFERENCE); 

     // the actual writing 
     writer.writeHeader(header); 

     for(Object anObj : dataObjs){ 
      writer.write(anObj, header);         
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      writer.close(); // closes writer and underlying stream 
     } catch (Exception e){} 
    } 
}; 

Super CSV 2.0.0-beta-1입니다. CSV 작성자는 Maven 지원과 새로운 Dozer 확장을 비롯한 수많은 다른 기능을 추가 할뿐만 아니라 flush() 메소드도 공개합니다.

+0

알았어요. 그렇지만 난 (명령과 상관없이) 한 컨트롤러 호출에서 작동하고 왜 문제가 호출되는 메서드 안에 있다면 다른 컨트롤러에서 실패했는지, 왜 당황 스럽다. – Raevik

+0

@Brent 어쩌면 데이터의 크기가 영향을 미칩니 까? –

관련 문제