2013-02-19 5 views
1

Я пытаюсь сделать Csv загрузить таким же образом, как здесь: How to provide a file download from a JSF backing bean?JSF загрузить CSV в боб

Мой ответ продолжает бросать nullPointerException на output.write() в линию. Боб имеет область запроса. Любые мысли относительно нулевого указателя?

try 
    { 
     //submitForm(); 
     FacesContext fc = FacesContext.getCurrentInstance(); 
     HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 

     response.reset(); 
     response.setContentType("text/csv"); 
     //response.setContentLength(contentLength); 
      response.setHeader ("Content-disposition", "attachment; filename=\"Reporting-" + 
        new Date().getTime() + ".csv\""); 

     OutputStream output = response.getOutputStream(); 
     String s = "\"Project #\",\"Project Name\",\"Product Feature(s)\","; 
     s+="\"Project Status\","; 
     s+="\"Install Type\","; 
     s+="\"Beta Test\",\"Beta Test New/Updated\","; 
     s+="\"Production\",\"Production New/Updated\","; 
     s+="\n"; 
     InputStream is = new ByteArrayInputStream(s.getBytes("UTF-8")); 
     int nextChar; 

     while ((nextChar = is.read()) != -1) 
     { 
      output.write(nextChar); 
     } 
     output.close(); 

    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

Это не проблема прямого JSF. Вам нужно [преобразовать String в поток] (http://stackoverflow.com/q/247161/1065197). Кроме того, не забудьте закрыть выход. –

+0

Изменено на InputStream и отправлено на OutputStream, и он все равно бросает nullPointer на output.write. Мысли? – user1523885

+0

Ваша переменная 'output' имеет значение« null », что очень странно. –

ответ

0

3 вещи выскочить здесь

  1. Failing называть responseComplete() на FacesContext довольно много значит JSF будет продолжать обрабатывать запрос, и вы не можете повлиять на результат.

  2. Звонок reset() не нужен.

  3. OutputStream должен быть типа ServletOutputStream

    Попробуйте следующий фрагмент вместо

    try 
    { 
    //submitForm(); 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 
    
    
    response.setContentType("text/csv"); 
    fc.responseComplete(); 
    //response.setContentLength(contentLength); 
        response.setHeader ("Content-disposition", "attachment; filename=\"Reporting-" + 
          new Date().getTime() + ".csv\""); 
    
    ServletOutputStream output = response.getOutputStream(); 
    String s = "\"Project #\",\"Project Name\",\"Product Feature(s)\","; 
    s+="\"Project Status\","; 
    s+="\"Install Type\","; 
    s+="\"Beta Test\",\"Beta Test New/Updated\","; 
    s+="\"Production\",\"Production New/Updated\","; 
    s+="\n"; 
    InputStream is = new ByteArrayInputStream(s.getBytes("UTF-8")); 
    int nextChar; 
    
    while ((nextChar = is.read()) != -1) 
    { 
        output.write(nextChar); 
    } 
        output.flush(); 
    
    output.close(); 
    
    } 
    catch (IOException e) 
    { 
    // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } 
    

Кроме того, вы можете просто позвонить sos.println(s) без необходимости все, что работать вы там делаете

+0

По-прежнему появляется ошибка после изменений. com.sun.faces.lifecycle.ApplyRequestValuesPhase execute # {DownloadBean.doDownload}: javax.faces.el.EvaluationException: java.lang.NullPointerException javax.faces.FacesException: # {DownloadBean.doDownload}: javax.faces.el. EvaluationException: java.lang.NullPointerException – user1523885

+0

Если я попытаюсь выполнить println в response.getContentType() сразу после его установки, он ничего не возвращает. Поэтому на самом деле мой ответ равен null, потому что getContentType() ничего не возвращает. Как ответ может быть нулевым? – user1523885

+0

@ user1523885, если 'response == null', то' response.getContentType() 'будет вызывать NPE. Попробуйте переместить 'fc.responseComplete();' вверх по строке. – kolossus

Смежные вопросы