InputStream

Pessoal, estou tendo uma grande dificuldade com o InputStream.
Quando não consigo pegar a imagem do upload e gravar no banco de dados
Dá o seguinte erro:

java.lang.NullPointerException
        at classes.Noticia.Cadastro(Noticia.java:174)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:172)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
        at javax.faces.component.UICommand.broadcast(UICommand.java:387)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:756)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:18)
        at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.renderCycle(ReceiveSendUpdates.java:132)
        at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.service(ReceiveSendUpdates.java:74)
        at com.icesoft.faces.webapp.http.core.RequestVerifier.service(RequestVerifier.java:31)
        at com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service(PathDispatcherServer.java:24)
        at com.icesoft.faces.webapp.http.servlet.BasicAdaptingServlet.service(BasicAdaptingServlet.java:16)
        at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23)
        at com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service(SessionDispatcher.java:53)
        at com.icesoft.faces.webapp.http.servlet.SessionVerifier.service(SessionVerifier.java:26)
        at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23)
        at com.icesoft.faces.webapp.http.servlet.MainServlet.service(MainServlet.java:131)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:56)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:619)

Essa linha 174 é referente a seguinte linha:

InputStream fis = getFoto().getInputStream();

Depois faço o seguinte:

Connection conn = Conexao.getConnection();

PreparedStatement st = conn.prepareStatement("insert into TBNoticias (Titulo,Noticia,Imagem) values ('" + getTitulo() + "','" + getNoticia() + "',?)");

st.setBinaryStream(1, fis, fis.available());

st.execute();

st.close();
conn.close();

Pessoal, agradeço a ajuda de vocês

se possivel manda o metodo inteiro que a linha esta.

ou a classe inteira.

Grato.

Ok,

public class Noticia implements Serializable {

    private int codigo;
    private String titulo;
    private String descricao;
    private String data;
    private String noticia;
    private byte[] nota;
    boolean visible;
    public UploadedFile foto;

    //Demais getters e setters

    public void setFoto(UploadedFile foto) {
        this.foto = foto;
    }

    public UploadedFile getFoto() {
        return foto;
    }

    // Método Cadastro
    public String Cadastro() {
        System.out.println("Esta Aqui");

        try {
            System.out.println("\n\n\n\nTitulo: " + getTitulo());
            System.out.println("\n\n\n\nNoticia: " + getNoticia());
            
            InputStream fis = getFoto().getInputStream();

            System.out.println("\n\n\n\nImagem: " + getFoto() + "\n\n\n\n");

            Connection conn = Conexao.getConnection();

            PreparedStatement st = conn.prepareStatement("insert into TBNoticias (Titulo,Noticia,Imagem) values ('" + getTitulo() + "','" + getNoticia() + "',?)");

            st.setBinaryStream(1, fis, fis.available());

            st.execute();

            st.close();
            conn.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "ok";
    }

Está ocorrendo este erro porque o teu atributo foto está nulo, sem nem uma “foto” nele.

Para não acontecer isto vc pode fazer o seguinte:


    public String Cadastro() {  
        
         try {  
             System.out.println("\n\n\n\nTitulo: " + getTitulo());  
             System.out.println("\n\n\n\nNoticia: " + getNoticia());  
               
             if(getFoto() != null){

                 InputStream fis = getFoto().getInputStream();  
                 System.out.println("\n\n\n\nImagem: " + getFoto() + "\n\n\n\n");  
                 Connection conn = Conexao.getConnection();  
                 PreparedStatement st = conn.prepareStatement("insert into TBNoticias (Titulo,Noticia,Imagem) values ('" + getTitulo() + "','" + getNoticia() + "',?)");  
                 st.setBinaryStream(1, fis, fis.available());  
                 st.execute();  
                st.close();  
                conn.close();  

              }else{
                 return "não Ok"
              }

         } catch (Exception e) {  
             e.printStackTrace();  
         }  
         return "ok";  
     }  

Pois antes de vc persistir na base vc verifica se tem alguma foto para ser gravada se não estiver a foto vc retorna uma msg para ser mostrada.

Duvidas estamos ai.

Brigadão joaorafael pela resposta.
Até entendi o que você quis dizer cara, mas o problema é que mesmo colocando a foto ele aparece null.
A maneira que eu fiz está certa?
Usando isso:

InputStream fis = getFoto().getInputStream();  

// E depois isso:

st.setBinaryStream(1, fis, fis.available());

Tem outra maneira que eu possa fazer isso?

Obrigado

Up!

Eu não salvaria as foto no banco,
mais sim salvaria em uma pasta no servidor.

E no banco salvaria o nome dela.

Pois o local onde vc for salvar as fotos nunca iria mudar, e na hora de buscar passaria o local com o nome da foto.

Sei que existe essa possibilidade, mas ao analisarmos a situação, a melhor opção é gravar no banco de dados mesmo

Up!

Ninguém pessoal?

Cara olhando seu código eu só consigo ver que a única possibilidade de NullPointerException nessa linha é o metodo getFoto() retornar nulo. Então debuga sua aplicação e vê se realmente você está colocando uma instância dentro desse atributo “public UploadedFile foto;”
Creio que ele está nulo, mesmo você tentando “colocar” algo nele. Verifica onde você está chamando o método setFoto e se realmente está sendo atribuido alguma coisa. Debug nele!!! :smiley:

Att,

Nulo ele está realmente, o problema é que não consigo atribuir um valor para ele.
E é essa minha dúvida: como posso fazer para conseguir atribuir um valor ao getFoto, ou se tem uma outra forma de se fazer upload de fotos com páginas jspx.

Obrigado pela resposta :smiley:

Up!

Ele é um projeto Struts, JSF ,Vraptor…?

JSF

UP!