나는 내가 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을 확인한 (객체, 헤더) 호출 전달되는 개체의 수에 따라 시간의 예상 번호를 쳐서되고 이러한 개체는 예상 데이터를 가지고
제안이나 통찰력이 있으면 크게 감사하겠습니다. 나는 그 문제를 더 잘 분리하는 방법을 정말로 잘 모르겠다. ...
작가를 종료 하시겠습니까? –