Selctonemenu JSF CDI Hibernate JPA Primefaces

5 respostas
F

Estou tentando fazer uma busca para carregar o datatable com base no objeto selecionado num SelectOneMenu. Estou iniciando em programação, mas me parece estranha a pilha de null’s.

Essa é a exceção:

com.sun.faces.context.PartialViewContextImpl processPartial
INFORMAÇÕES: java.lang.NullPointerException
java.lang.NullPointerException
	at com.calendarioAp.controller.GestaoAreaBean.consultar(GestaoAreaBean.java:71)
	at com.calendarioAp.controller.GestaoAreaBean.localSelecionado(GestaoAreaBean.java:53)
	at com.calendarioAp.util.SetConverter.getAsObject(SetConverter.java:19)
	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:201)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:318)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.getConvertedValue(SelectOneMenuRenderer.java:67)
	at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1045)
	at javax.faces.component.UIInput.validate(UIInput.java:975)
	at javax.faces.component.UIInput.executeValidate(UIInput.java:1248)
	at javax.faces.component.UIInput.processDecodes(UIInput.java:679)
	at 
...

Meu --> .xhtml

<f:metadata>
	<f:viewAction action="#{gestaoAreaBean.consultar}"></f:viewAction>
	<f:viewAction action="#{gestaoAreaBean.consultaLocais}"></f:viewAction>
</f:metadata>

<h:form id="formulario">
<p:messages id="msgs" />
			
<p:selectOneMenu id="local" converter="localConverter" value="#{gestaoAreaBean.selectedlocal}" immediate="true">

		<f:selectItem    itemLabel="Selecione" itemValue="#{null}" />
		<f:selectItems value="#{gestaoAreaBean.todosLocais}" var="localizacao" 
				itemLabel="#{localizacao.nomeLocal}"
				itemValue="#{localizacao}" />
<p:ajax event="change"  render="gestaoAreaBean.localSelecionado" execute="@this" />
	
</p:selectOneMenu>

Meu --> Bean:

//Esse método deve receber o ID do objeto selecionado no SelectOneMenu e executar a pesquisa para preencher o DataTable.

public  String localSelecionado(String value){
		localSelect = Long.valueOf(value);
		System.out.println("Local selecionado Long -> "+ localSelect);
		consultar();
		return value;
	}

//Métodos que inicia a chamada da pesquisa tendo o ID como parâmetro:
public void consultar(){
		System.out.println( "local selecionado dentro do consultar "+ localSelect);

		if(localSelect != null){
		Long id = localSelect;
		todasAreas = areas.areasLocaisId(id);
		}
	}

//Método que executa a pesquisa e devolve o list:
public List<Area> areasLocaisId(Long id){
		return manager.createQuery("from Area a where a.localizacao = :id", Area.class).setParameter("id", manager.getReference(Local.class, id)).getResultList();
	}

5 Respostas

campelo.m

O value do método localSelecionado esta recebendo o valor correto?

F

Sim. Da forma como está, o id de cada objeto selecionado no select está sendo adicionado no método “localSelecionado”. Consigo chegar com o valor selecionado até o método de busca. Mas logo após executá-lo, estoura a excessão.
Setei manualmente um valor no parâmetro do método de “busca” e ele traz os objetos referentes ao valore do parâmetro setado e popula o dataTable.

campelo.m

Altere o set parameter para setParameter(“id”, id)

F

Oi Campelo.m.
Fiz a alteração a qual você sugeriu. Da troca do - manager.getReference(Local.class, id) - por id.

  • A pilha de Erros continua a mesma na execução a qual deveria ocorrer com a busca a partir do change do select.

  • Além disso, fiz o teste setanto o valor do id diretamente no parâmetro do método para ver se executaria o método de busca, mas infelizmente ocorreu o erro abaixo.

java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [com.calendarioAp.model.Local (n/a)]


dez 01, 2016 8:40:42 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute

ADVERTÊNCIA: #{gestaoAreaBean.consultar}: java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [com.calendarioAp.model.Local (n/a)]

javax.faces.FacesException: #{gestaoAreaBean.consultar}: java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [com.calendarioAp.model.Local (n/a)]

at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)

at javax.faces.component.UIViewAction.broadcast(UIViewAction.java:562)

at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)

at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)

at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)

at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

at javax.faces.webapp.FacesServlet.service(FacesServlet.


F

Olá Campelo.m.
Resolvi com o código abaixo. Sem utilizar o converter. Não descobri qual era o problema se era no converter ou nos eventos que tentei utilizar no selectonemenu. Mas da forma como está atende o que preciso.

  • Contudo, quando seleciono um iten no selectonemenu, tipo objeto-1, ele não responde imediatamente no bean. Só responde quando seleciono outro objeto, tipo o objeto-3, então ele vai enviar para o método o objeto-1. Como se estivesse sempre com a informação atrasada.
<h:panelGrid columns=“3” style=“margin-top:15px”>

<p:outputLabel value=“Selecionar Local: " />

<p:selectOneMenu id=“local-select"

value=”#{gestaoAreaBean.localEscolhido}“

valueChangeListener=”#{gestaoAreaBean.localSelecionado}”>

<f:selectItem  itemLabel=“Selecione o Local” noSelectionOption=“true” />

<f:selectItems value="#{gestaoLocalBean.todosLocais}“

var=“localizacao” itemLabel=”#{localizacao.nomeLocal}“

itemValue=”#{<a href="http://localizacao.id">localizacao.id</a>}"  />

<p:ajax event=“change”  ></p:ajax>

</p:selectOneMenu>

</h:panelGrid>
Criado 29 de novembro de 2016
Ultima resposta 19 de dez. de 2016
Respostas 5
Participantes 2