Session injetada no Dao - The value for the useBean class attribute ... is invalid

5 respostas
J

Boa noite pessoal do fórum, estou com um problema de IoC em uma JSP. Eu tenho as seguintes classes em meu projeto:

public class Item{
    
     //atributos e métodos da classe
}

public class GrupoDao {

	private final Session session;

	public GrupoDao(Session s) {

		this.session = s;
	}

        //métodos do DAO

}

O problema é quando eu tenho que atualizar um ITEM. O meu ItemController retorna para view o ITEM a ser editado, até ai tudo bem, mas
só que nessa view eu tenho um SELECT que eu fazia assim para preenche-lo:

Grupo:<select name="item.fk_grupo">	

		<!-- cria a lista -->
		<jsp:useBean id="dao" class="br.com.dao.GrupoDao"/>
		<c:forEach var="grupo" items="${dao.lista}">
			<option value="${grupo.id_grupo}">${grupo.desc_grupo}</option>
		</c:forEach>
		</select>

Só que dessa forma forma eu tenho o seguinte erro:

org.apache.jasper.JasperException: /WEB-INF/jsp/item/edita.jsp (line: 32, column: 2) The value for the useBean class attribute br.com.dao.GrupoDao is invalid.

Eu não tinha esse problema até passar a receber a Session no construtor do GrupoDao (eu segui o exemplo da apostila f-28 da Caelum). Quando a Session
não era injetada no construtor o código acima funcionava, pois obedecia o critério do bean (construtor sem argumentos). Como eu faço pra contornar esse problema??
Tem como o Vraptor retornar mais de um objeto para a view (ele já retorna o item a ser editado)???

Obrigado desde já,

Jonh

5 Respostas

Hebert_Coelho

Você precisar ter um construtor default sem argumentos. Tenta aí.

J

Se eu criar um construtor padrão (sem argumentos) eu vou ter outro erro:

org.apache.jasper.el.JspELException: /WEB-INF/jsp/item/edita.jsp(33,2) '${dao.lista}' Error reading 'lista' on type br.com.dao.GrupoDao
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:112)
	org.apache.jsp.WEB_002dINF.jsp.item.edita_jsp._jspx_meth_c_005fforEach_005f0(edita_jsp.java:238)
	org.apache.jsp.WEB_002dINF.jsp.item.edita_jsp._jspService(edita_jsp.java:131)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	br.com.caelum.vraptor.core.DefaultStaticContentHandler.deferProcessingToContainer(DefaultStaticContentHandler.java:64) 

       ....

        java.lang.NullPointerException
	br.com.dao.GrupoDao.getLista(GrupoDao.java:46)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
	org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:106)
	org.apache.jsp.WEB_002dINF.jsp.item.edita_jsp._jspx_meth_c_005fforEach_005f0(edita_jsp.java:238)
	org.apache.jsp.WEB_002dINF.jsp.item.edita_jsp._jspService(edita_jsp.java:131)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Isso porque a Session não está injetada na classe GrupoDao.

Hebert_Coelho

Sim, mas geralmente a injeção não é feita pelo contrutor (a não ser que o Spring faça isso).

Vc está usando qual framework?

J

Eu uso o VRaptor, que por sua vez usa Spring para gerenciar dependências.

Hebert_Coelho

E é assim que os valores são injetados? Pelos construtores? Não tem anotações ou xml?

Criado 7 de janeiro de 2012
Ultima resposta 8 de jan. de 2012
Respostas 5
Participantes 2