[resolvido]WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw

8 respostas
andreacerqueira

Não consigo mostrar os dados de uma consulta usando jsp:useBean, quando listo da forma normal, mostra tudo corretamente, é só adicionar o que dá pau.

INFO: Conectannnnndo ao banco!

WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception
java.lang.InstantiationException: class pack.modelo.ContatoDAO : java.lang.InstantiationException: pack.modelo.ContatoDAO
	at org.apache.jsp.lista_002dcontatos_jsp._jspService(lista_002dcontatos_jsp.java:85)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
	at pack.filtro.FiltroConexao.doFilter(FiltroConexao.java:22)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
assim funciona:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@page import="java.util.*, pack.modelo.*"%>

<c:import url="header.jsp" />

<h1>Lista de Contatos</h1>

<table>
	<%
	ContatoDAO dao = new ContatoDAO(null);
	List<Contato> contatos = dao.getLista();
	for (Contato contato : contatos ) {
	%>
		<tr>
			<td><%=contato.getNome() %></td>
			<td><%=contato.getEmail() %></td>
			<td><%=contato.getEndereco() %></td>
			<td><%=contato.getDataNascimento().getTime() %></td>
		</tr>
	<%
	}
	%>
</table>

<br clear="all" />

<c:import url="footer.jsp" />
assim não:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@page import="pack.modelo.ContatoDAO"%>

<c:import url="header.jsp" />

<h1>Lista de Contatos</h1>

<!-- cria lista --> 
<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

<form action="adicionaContato" method="post">
    <table class="lista">
        <thead>
            <tr>
                <th>Nome</th>
                <th>Email</th>
                <th>Endereço</th>
                <th>Nascimento</th>
                <th>Editar</th>
                <th>Excluir</th>
            </tr>
        </thead>
        <tbody>
            <!-- for -->
            <c:forEach var="contato" items="${dao.lista}" varStatus="id">
                <tr bgcolor="${id.count % 2 == 0 ? '#aaee88' : '#ffffff'}" >
                    <td>${contato.nome}</td>
                    <td>
                        <c:if test="${not empty contato.email}">
                            <a href="mailto:${contato.email}">${contato.email}</a>
                        </c:if>
                        <c:if test="${empty contato.email}">
                            Email não informado
                        </c:if>
                    </td>
                    <td>${contato.endereco}</td>
                    <td><fmt:formatDate value="${contato.dataNascimento.time}" pattern="dd/MM/yyyy" /></td>
                    <td><a href="mvc?logica=AlteraContatoLogic&id=${contato.id}">Alterar</a></td>
                    <td><a href="mvc?logica=RemoveContatoLogic&id=${contato.id}">Remover</a></td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
</form>

<br clear="all" />

<c:import url="footer.jsp" />

Alguém pode me dar uma luz?

8 Respostas

thiagof

Fala andreacerqueira!

A exceção foi essa: java.lang.InstantiationException
e porque não foi possível instanciar o objeto?

Assim funciona:

ContatoDAO dao = new ContatoDAO(null);

e assim não:

<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

Será que não é porque o objeto ContatoDAO espera que vc passe algum parâmetro para o construtor dele?
Repara no código que funciona, lá vc passa um null para o construtor :wink:

vai ver é isso…
tenta criar um construtor vazio para esse objeto… pode ser que assim o código funcione :smiley:

ou se precisar passar algum valor para o construtor, tenta isso:

<jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"> <jsp:setProperty .../> </jsp:useBean>
Obj.: Não sei se desse jeito é passado o valor direto para o construtor do objeto ou se ele cria um objeto vazio e depois passa os valores :frowning:

Dá uma olhada nesse link, pode ser que te ajude:
http://docs.oracle.com/javaee/1.3/tutorial/doc/JSPIntro11.html

andreacerqueira

oi thiago, muito obrigado por ter respondido.
então, a conexão é aberta e fechada por um filtro, por isso que tem o parametro a ser passado, eu fiz uma gambiarra pra testar a página sem scriptlet com um if e else e funcionou, mas eu tirei isso da DAO, o ideal serial ela pegar os dados da conexão pelo filtro.
dai com a sua linha de raciocinio eu coloquei assim no jsp que lista:

<% Connection connection = (Connection)request.getAttribute("connection"); %> <jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" value="${connection}" /> </jsp:useBean>
mas continua dando erro.
nas minhas lógicas a conexão é pega assim:

Connection connection = (Connection) request.getAttribute("connection"); ContatoDAO dao = new ContatoDAO(connection);
mas no usebean eu ainda vou passar o valor né, ele já deve ir como tipo connection pois o construtor pede o parametro desse tipo.

thiagof

Ola André!!

Cara eu dei uma pesquisada por ai e pelo que entendi, não é possível passar parametros para um construtor de um Bean, porque segundo a especificação dos javaBeans, todo Bean tem que ter um construtor padrão (sem parametros), ai a tag <jsp:setProperty /> vai passar os valores para as propriedades do bean depois que ele for criado através de se construtor padrão (sem parametros)

Tenta criar um construtor padrão para a sua classe ContatoDAO e depois seta o atributo connection nela desse mesmo jeito que vc mencionou:

<% Connection connection = (Connection)request.getAttribute("connection"); %> <jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" value="${connection}" /> </jsp:useBean>
E será que não tem como melhorar esse trecho de código? tipo assim:

<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" param="connection"/> </jsp:useBean>
Repara que ali na tag o atributo param pega um atributo do objeto request: ai não precisa dessa linha de código:

<% Connection connection = (Connection)request.getAttribute("connection"); %> Não sei se isso funciona, mas é o que a documentação ta dizendo (naquele link que passei para vc)

Resumindo… cria um construtor padrão (sem parâmetros) para sua classe ContatoDAO e veja se o erro continua, se não der erro (aquele erro java.lang.InstantiationException)
ai já descobrimos que o problema era o construtor padrão que tava faltando :wink:

andreacerqueira

Mmmmmm entendi Thiago.
Putz, o problema é que eu tenho um filtro que abre e fecha as conexões, e ele deixa esse connection no “ar” que eu resgato no construtor da DAO pra passar para os outros métodos.

Tipo meu filtro é assim:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ try{ Connection connection = new ConnectionFactory().getConnection(); request.setAttribute("connection", connection); chain.doFilter(request, response); connection.close(); }catch(SQLException e){ throw new ServletException(e); } }

eu tô iniciando agora e talvez seja uma pergunta muito idiota, mas como eu conseguiria pegar esse atributo ao chamar a DAO?

thiagof

Hehehe não sei se entendi direito sua pergunta :D

mas só para me deixar dentro do seu contexto...

Essa classe: pack.modelo.ContatoDAO Não tem um construtor padrão né, tipo isso:
public class ContatoDAO {
    
    // esse é o construtor padrão do qual to falando... bem cru, sem nenhum parametro,  serve para criar um objeto vazio mesmo
    public ContatoDAO() {}
    // ...
    // ... outros contrutores aqui ...
    // ...
    // ... metodos da classe
}
Ai quando vc tenta criar um Bean com a instrução:
<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request">
    <jsp:setProperty name="dao" property="connection" value="${connection}" />  
</jsp:useBean>
O seu programa lança a exceção: java.lang.InstantiationException Porque sua classe ContatoDAO não possui aquele construtor padrão que eu mencionei la em cima, Correto??? (e a tag pede para sua classe ter um construtor daquele) Se vc criar um construtor daquele, vc só precisa criar um método na sua classe ContatoDAO, tipo esse:
public class ContatoDAO {
    // sua propriedade (atributo) "connection"
    Connection connection = null;

    // esse é o construtor padrão do qual to falando... bem cru, sem nenhum parametro,  serve para criar um objeto vazio mesmo
    public ContatoDAO() {}
    // ...
    // ... outros contrutores aqui ...
    // ...
    // ... metodos da classe
    // ... metodo que adiciona o objeto connection na classe ContatoDAO
    public void setConnection(Connection connection) {
        this.connection = connection;
    }
}
ai o código abaixo é para funcionar:
<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request">  
    <jsp:setProperty name="dao" property="connection" param="connection"/>  
</jsp:useBean>

O seu Filter tá certo!!
ele tá passando o objeto Connection para a pagina do ContatoDAO?
se tiver, ta tudo certo... era para funcionar...

tenta codificar a ideia doo contrutor padrão lá e se continuar dando erro, posta a msn de erro aqui de novo blz? :D

andreacerqueira

Tá complicado :slight_smile:
Na verdade funcionou perfeitamente o que vc me falou, mas até eu achar o pq parecia estar errado foi um custo.
O problema é o seguinte, só funciona no glassfish, e eu fiquei tentando no tomcat por horas, eu já apaguei a pasta work do tomcat e não adianta, já dei um clean no projeto e fez uns estragos que tive que arrumar.
Sua solução foi perfeita, o que me falta conseguir agora é fazer os beans funcionarem no meu tomcat, pois nenhum funciona nele, e todos funcionam no glassfish :frowning:
Agora começa a saga tomcat.

Thiago, muito muito muito obrigado

thiagof

hehe ola de novo andré!!

Se tem algo relacionado a beans que funciona no GlassFish e não funciona no Tomcat é o EJB (Enterprise JavaBeans)
não manjo muito de EJBs mas se vc estiver tentando usar no tomcat, esquece, não vai rolar :frowning:
porque o tomcat é só um servlet container, ou seja, um contêiner que executa servlets…
ja o glassfish é um autentico servidor de aplicações, que possui um servlet container junto.
seria como se vc tivesse um tomcat dentro do glassfish e muito mais coisas além disso :smiley:
glassfh está em outro patamar… tomcat não concorre com esse cara 8)
glassfish está no patamar do JBoss (redhat) e WebLogic (Oracle)

mas se vc não está usando EJB, o tomcat tá de bom tamanho porque é extremamente leve comparado aos outros que mencionei :smiley:

Dá uma lida nisso:
http://pt.wikipedia.org/wiki/Enterprise_JavaBeans
http://pt.wikipedia.org/wiki/Servidor_de_aplica%C3%A7%C3%A3o
http://pt.wikipedia.org/wiki/Glassfish
http://pt.wikipedia.org/wiki/Apache_Tomcat

andreacerqueira

mmmmm :slight_smile:
nem sei como faz pra usar ejb hehehehe, mas vou ver se fiz alguma cagada.
vou ver o que faço pra usar o que estou fazendo no tomcat, pois como é estudo, é melhor fazer funcionar nele.
muito obrigado pelas explicações.
tópico resolvido :wink:

Criado 29 de abril de 2012
Ultima resposta 1 de mai. de 2012
Respostas 8
Participantes 2