FacesContext.getCurrentInstance()

Caros amigos estou com um problema eu tenho um método que possui este parametro para eu receber FacesContext.getCurrentInstance() mas se eu fizer com uma pagina jsp normal ele passa null e quando eu uso o modo designer do netbeans ele funciona perfeitamente alguem saberei como resolver este problema…

olha não sei se isso vai funcionar, mas acredito que ele esteja vindo nulo porque a página que você está chamando não está no contexto jsf

ou seja, há diferença entre você chamar index.jsp e index.jsf por exemplo

Tive um problema parecido e espero que te ajude…

Eu precisava carregar um popup para que usuário pudesse escolher o local para ser salvo um arquivo.

FacesContext currentInstance = FacesContext.getCurrentInstance(); OutputStream os = getHttpServletResponse(currentInstance).getOutputStream();

Aqui resolveu o NullPointerException

public HttpServletResponse getHttpServletResponse(FacesContext currentInstance) { return ((javax.servlet.http.HttpServletResponse) currentInstance.getExternalContext().getResponse()); }

até ai eu sei…
Mas eu gostaria de saber se existe uma solução para este problema… tipo uma configuração…

você usa JSF 1.2? ou 1.1?

1.1

poderia você explicar melhor esse problema?

sinceramente não consegui entender…

package web2;

import java.io.File;   
import java.io.FileInputStream;   
import java.io.IOException;   
import java.io.OutputStream;   
import javax.faces.context.ExternalContext;   
import javax.faces.context.FacesContext;   
import javax.servlet.http.HttpServletResponse;   
import javax.swing.JOptionPane;
  
public class Download {   
  
    public static synchronized void downloadFile(String filename, String fileLocation, String mimeType, FacesContext facesContext) {   
  
        ExternalContext context = facesContext.getExternalContext(); // Context   
        String path = fileLocation; // Localizacao do arquivo   
        String fullFileName = path + filename;   
        File file = new File(fullFileName); // Objeto arquivo mesmo :)   
  
        HttpServletResponse response = (HttpServletResponse) context.getResponse();   
        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload   
        response.setContentLength((int) file.length()); // O tamanho do arquivo   
        response.setContentType(mimeType); // e obviamente o tipo   
  
        try {   
            FileInputStream in = new FileInputStream(file);   
            OutputStream out = response.getOutputStream();   
  
            byte[] buf = new byte[(int)file.length()];   
            int count;   
            while ((count = in.read(buf)) >= 0) {   
                out.write(buf, 0, count);   
            }
            
            in.close();   
            out.flush();   
            out.close();   
        facesContext.responseComplete();   
        } catch (IOException ex) {   
            JOptionPane.showMessageDialog(null,"Erro no download do arquivo: " + ex.getMessage());   
            ex.printStackTrace();   
        }   
    }   
}

Este método faz o download de um arquivo…
e possui este parametro “FacesContext facesContext” mas se eu fizer com uma pagina jsp normal ele passa null e quando eu uso o modo designer do netbeans ele funciona perfeitamente…

o.O

caramba!

bom, deixa eu ver

tu já tentou tirar esse FacesContext do parâmetro e, nessa linha

ExternalContext context = facesContext.getExternalContext();

trocar para

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

?

Eis o problema ta passando null… no “facesContext”

você não entendeu o que eu quis dizer no último post?

TIRA o FacesContext do teu parâmetro e chama ele dentro do método e veja se ainda tá retornando nulo

abraço

ele não acha o getExternalContext()

Bom dia!!!

Pode fazer o seguinte:

No lugar de passar o FacesContext passa para HttpServletResponse response;

E dei uma melhorada nesse codigo seu porque não iria funcionar para web.


public static synchronized void downloadFile(String filename, String fileLocation, String mimeType, HttpServletResponse response) {   
  
        //ExternalContext context = facesContext.getExternalContext(); // Context   
        String path = fileLocation; // Localizacao do arquivo   
        String fullFileName = path + filename;   
        //File file = new File(fullFileName); // Objeto arquivo mesmo :)   
    URL url=null; 
        URLConnection conn=null;
      //  File file = new File(fullFileName);  // Objeto arquivo mesmo :)   
        
        
       try {
        url=new URL(fullFileName);
        conn=url.openConnection();
           
        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload   
        //response.setContentLength((int) file.length()); // O tamanho do arquivo
         response.setContentLength((int) conn.getContentLength()); // O tamanho do arquivo
        response.setContentType(mimeType); // e obviamente o tipo   
  
           
            
            InputStream in = conn.getInputStream();  //new FileInputStream(file);   
            OutputStream out = response.getOutputStream();   
  
            byte[] buf = new byte[(int) conn.getContentLength()];  
            int count;   
            while ((count = in.read(buf)) >= 0) {   
                out.write(buf, 0, count);   
            }
            
            in.close();   
            out.flush();   
            out.close();   
            
    //    facesContext.responseComplete();   
        } catch (IOException ex) {   
            JOptionPane.showMessageDialog(null,"Erro no download do arquivo: " + ex.getMessage());   
            ex.printStackTrace();   
        }   
    }  

Cara Testei Aqui 100% isso que eu precisava… Valeu…
Agradeço a todos pela ajuda…