Erro (jsf-seam) re-renderizando a pagina ao preencher combos aninhados

10 respostas
R

Pessoal.
Proceguindo em meu aprendizado, estou tentando fazer combos aninhados (Estado/Cidade),
contudo ao executar o metodo de buscar as cidades faço o query mas ao tentar retornar na tela o sistema trava e não consegue renderizar a tela.

O erro

11/10/2010 18:46:05 com.sun.facelets.FaceletViewHandler handleRenderException
GRAVE: Error Rendering View[/usuario.xhtml]
java.lang.NullPointerException: Argument Error: Parameter key is null
	at com.sun.faces.util.Util.notNull(Util.java:241)
	at com.sun.faces.context.RequestMap.remove(ExternalContextImpl.java:1093

Este e a bean

@Id  
@GeneratedValue  
@Column(name="idcidade")   
private Integer sequencialCidade;  
@Column(name="txcidade")       
private String nomeCidade;  
@Enumerated(EnumType.ORDINAL) // Tentei .STRING e o erro e o mesmo  
@Column(name="codestado")

Este é o enum

public enum Estado {  
     SP,RJ,PR,DF,ES,MG,SC,MT;  
 }

A pagina.

<dl>
            <dt><h:outputText value="Estado:" /></dt>
	    <dd>
	            	<h:selectOneMenu id="estado" value="#{usuarioAction.estadoEscolha}"> 
			    <f:selectItems value="#{usuarioAction.estado}" />
			    <a4j:support event="onchange" ajaxSingle="true" action="#{usuarioAction.PreencherCidade}" reRender="estado,cidade"/> 
			</h:selectOneMenu>
	    </dd>
            <dt><h:outputText value="Cidade:"/></dt>
            <dd>
	            	<h:selectOneMenu id="cidade" value="#{usuarioAction.cidadeEscolha}"> 
				<s:selectItems value="#{usuarioAction.cidades}" noSelectionLabel="Selecione..."/> 
				<s:convertEntity /> 
			</h:selectOneMenu>
	    </dd>	
</dl>

A chamada do metodo PreencherCidade()

public class UsuarioAction implements Serializable{
	
	@In	
        private br.romulor2.dao.UsuarioDAO usuarioDAO;
	@In	
	private br.romulor2.dao.CidadeDAO  cidadeDAO;
	
	private br.romulor2.bel.Usuario usuario;
	private List<br.romulor2.bel.Usuario> usuarios;
	private List<SelectItem> cidades;
	private List<SelectItem> estado;
	private List<Sexo> sexo;	
	private String estadoEscolha;
	private Integer cidadeEscolha;
	private String senhaConfirmacao;

	public String PreencherCidade() 
	{	
		        List<Cidade> cidadesResultado = new ArrayList<Cidade>();
        
                        Cidade cidadePesquisa = new Cidade();
        
                        Estado estadoPesquisa = null;
                        cidadePesquisa.setEstado(estadoPesquisa.valueOf(estadoEscolha));
                        cidadesResultado = cidadeDAO.pesquisar(cidadePesquisa);
        
                        cidades.add(new SelectItem(0,"Selecione..."));
                        for(int i= 0; i <cidadesResultado.size(); i++)
                        cidades.add(new SelectItem(cidadesResultado.get(i).getSequencialCidade(),cidadesResultado.get(i).getNomeCidade()));
        
                        //"iniciando" o combo
                        cidadeEscolha = 0;
        
                        return "SUCCESS";
	}

	public List<br.romulor2.adorandocommusica.bel.Cidade> getCidades() {
		return cidades;
	}


	public void setCidades(List<br.romulor2.adorandocommusica.bel.Cidade> cidades) {
		this.cidades = cidades;
	}
	
	public String getEstadoEscolha() {
		return estadoEscolha;
	}


	public void setEstadoEscolha(String estadoEscolha) {
		this.estadoEscolha = estadoEscolha;
	}	

	public void setEstado(List<SelectItem> estado) {
		this.estado = estado;
	}

	public List<SelectItem> getEstado() {
		return estado;
	}
	
}

O metodo pesquisar da Dao

public List<Cidade> pesquisar(br.romulor2.bel.Cidade cidade) 
{
	String query = "from br.romulor2.bel.Cidade c ";
	Query pesquisa = null;
	int i = 0;

	if(cidade.getNomeCidade() != null)
	{
		if (i==0) query += " where ";
		query = query + "nomeCidade = :nomeCidade";
		i++;
	}
	if(cidade.getEstado().toString() != null)
	{
		if (i==0) query += " where "; else query += " and ";
		query = query + "estado = :estado";
	}

	pesquisa = teste.createQuery(query);

	if(cidade.getNomeCidade() != null)
		pesquisa.setString("nomeCidade",cidade.getNomeCidade());

	if(cidade.getEstado().toString() != null)
		pesquisa.setString("estado",cidade.getEstado().toString());

	return pesquisa.list();
}

10 Respostas

sammers21

O problema e que sua enum esta vazia tente fanzendo algo tipo, neste caso quando usar Kg, este terá um valor igual a 4, apenas adpte para a sua situação

public enum DominioUnidadeMedida {

cm3(57),

g(6),

Kg(4),

L(24),

mg(2),

mL(11),

mm3(56),

M3(49),

Ton(31);



private Integer codigo;



private DominioUnidadeMedida(Integer codigo) {

	this.codigo = codigo;

}



public Integer getCodigo() {

	return codigo;

}

}

R

Amigão mudei o enum como você indicou, mas o erro persiste.
No debug percebi que o codigo é todo executado e o erro acontece somente ao re-renderizar a tela. Ele chega a até executar os getters buscando os valores, mas parece que está buscando algum parametro ou algum objeto com uma caracteristica que não esta sendo passada.

O erro.

com.sun.facelets.FaceletViewHandler handleRenderException
GRAVE: Error Rendering View[/usuario.xhtml]
java.lang.NullPointerException: Argument Error: Parameter key is null
	at com.sun.faces.util.Util.notNull(Util.java:241)
	at com.sun.faces.context.RequestMap.remove(ExternalContextImpl.java:1093)
	at org.jboss.seam.ui.component.UISelectItems$ContextualSelectItem.cleanup(UISelectItems.java:78)
	at org.jboss.seam.ui.component.UISelectItems$ContextualSelectItem.create(UISelectItems.java:95)
	at org.jboss.seam.ui.component.UISelectItems.asSelectItems(UISelectItems.java:195)
	at org.jboss.seam.ui.component.UISelectItems.getValue(UISelectItems.java:166)
	at com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:296)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:810)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:861)
	at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:286)
	at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:125)
	at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
	at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
	at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
	at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
	at org.ajax4jsf.renderkit.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:123)
	at org.ajax4jsf.component.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:641)
	at org.ajax4jsf.component.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:512)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
	at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:503)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
	at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:256)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:362)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:488)
	at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	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:127)
	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:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

O enum alterado como foi sujerido

public enum Estado {
	SP("SP"),RJ("RJ"),PR("PR"),DF("DF"),ES("ES"),MG("MG"),SC("SP"),MT("MT");
	
	private String codigo;
	private Estado(String codigo) {
	this.codigo = codigo;

	}



	public String getCodigo() {
	return codigo;
	} 	
}
sammers21

kra vc alterou alguma coisa no teu selectOneMenu?

R

Rapaz. Havia alterado mesmo, várias vezes por sinal! (risos) Como ainda não encontrei o que está errado tenho tentado muitas coisas diferentes.

Se puder me ajudar agradeço muito, pois o que deveria ser simples está virando uma novela.

Atualizei o codigo que esta no primeiro post.

sammers21

kra vou te mandar uma enum e h:select como exemplo derrepente facilita no caso como eu uso Seam o value="#{listarHorarios}" se trata de uma factory

<h:selectOneMenu value="#{disponibilidadeSalaDecorator.hrInicioFuncionamento}" >
						<s:selectItems value="#{listarHorarios}" var="horarioInicial" label="#{horarioInicial.descricao}" itemValue="#{horarioInicial.descricao}" noSelectionLabel="" />
					</h:selectOneMenu>

Vai a enum:

public enum Horario {

	HORARIO_12_00("12:00"),
	HORARIO_12_30("12:30"),
	HORARIO_13_00("13:00"),
	HORARIO_13_30("13:30"),
	HORARIO_14_00("14:00"),
	HORARIO_14_30("14:30"),
	HORARIO_15_00("15:00"),
	HORARIO_15_30("15:30"),
	HORARIO_16_00("16:00"),
	HORARIO_16_30("16:30"),
	HORARIO_17_00("17:00"),
	HORARIO_17_30("17:30"),
	HORARIO_18_00("18:00"),

	
	private String descricao;
	
	private Horario(String descricao){
		this.descricao = descricao;
	}

	public String getDescricao() {
		return descricao;
	}
	
}
R

Cara não entendi como isso funciona:

disponibilidadeSalaDecorator é a sua classe de controle (controller ou action)?
listarHorarios é uma outra classe, ou está dentro da disponibilidadeSalaDecorator? Se é outra como fica o page.xml?
horarioInicial é um parametro de retorno de um metodo, ou uma propriedade de listarHorarios?

Quanto a minha tela acho que estou fazendo tudo certo, mas na hora de rerender os combos da esse pau.

sammers21

Ela é tem o mesmo papel da sua action e quanto ao listarHorarios é apenas uma forma de carregar a minha lista de horarios (Enum) na action

@Factory("listarHorarios") public List<Horario> listarHorarios() { return Arrays.asList(Horario.values()); }

sammers21

E krinha vc conseguiu?

educorso

Boa sammers21,

valeu a dica, eu tava me quebrando pra usar isso também, comecei a usar o Seam num projeto recente.

Eu tinha tentado usar a @Enumerated, mas n tava rolando.

lyon

Uma maneira super simples de resolver seria assim

Enum:

public enum EstadosBrasilEnum {
		 AC, // Acre
		 AL, // Alagoas
		 AP, // Amapá
		 AM, // Amazonas
		 BA, // Bahia
		 CE, // Ceará
		 DF, // Distrito Federal
		 ES, // Espírito Santo
		 GO, // Goiás
		 MA, // Maranhão
		 MT, // Mato Grosso
		 MS, // Mato Grosso do Sul
		 MG, // Minas Gerais
		 PA, // Pará
		 PB, // Paraíba
		 PR, // Paraná
		 PE, // Pernambuco
		 PI, // Piauí
		 RR, // Roraima
		 RO, // Rondônia
		 RJ, // Rio de Janeiro
		 RN, // Rio Grande do Norte
		 RS, // Rio Grande do Sul
		 SC, // Santa Catarina
		 SP, // São Paulo
		 SE, // Sergipe
		 TO // Tocantins
}

Bean:

public List<String> getListEstados() {
        listEstados = new ArrayList<String>();
	for (EstadosBrasilEnum ebr : EstadosBrasilEnum.values()) {
		listEstados.add(ebr.toString());
	}
        return listEstados;
}

public void setListEstados(List<String> listEstados) {
	this.listEstados = listEstados;
}

View;

<h:selectOneMenu value="#{funcionarios.funcionario.uf}"
	align="right" styleClass="select">
	<s:selectItems value="#{funcionarios.listEstados}" noSelectionLabel="" 
		var="item" label="#{item}"/>
</h:selectOneMenu>

Espero ter ajudado!

Criado 11 de outubro de 2010
Ultima resposta 3 de fev. de 2012
Respostas 10
Participantes 4