Boa noite pessoal do fórum, estou com um problema de IoC em uma JSP. Eu tenho as seguintes classes em meu projeto:
[code]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
}
[/code]
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:
[code]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>[/code]
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
Você precisar ter um construtor default sem argumentos. Tenta aí.
Se eu criar um construtor padrão (sem argumentos) eu vou ter outro erro:
[code]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)[/code]
Isso porque a Session não está injetada na classe GrupoDao.
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?
Eu uso o VRaptor, que por sua vez usa Spring para gerenciar dependências.
E é assim que os valores são injetados? Pelos construtores? Não tem anotações ou xml?