JSF 2 X 0 Eu

25 respostas
UpTheIrons

Bom dia pessoal,

Eu tô caindo numa "NullPointerException" desde ontem pela manha e a solução usada em outros casos
na mesma controller não está dando certo.

O cenário é o seguinte:
Estou numa pagina "lista", seleciono um item e vou editá-lo, lá alguns combos serão carregados, blz,
o combo cboUF é carregado, se clico em voltar sem selecionar item algum, retorna para a pagina "lista",
mas se seleciono um item, pronto, qq botão que clico me retorna isso:

java.lang.NullPointerException at br.com.orionti.sige.dao.GenericDAO.getListAll(GenericDAO.java:148) at br.com.orionti.sige.dao.UFDAO.getList(UFDAO.java:27) at br.com.orionti.sige.converter.UFConverter.getAsObject(UFConverter.java:32) at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171) at com.sun.faces.renderkit.html_basic.MenuRenderer.conv ...
controller:
public List<UF> listUF() {
		
		if (ufs == null) {			
			ufs = ufDAO.getList();
			
			return ufs;	
		}
		return ufs;
	}
view:
<p:selectOneMenu id="cboUF" style="width: 150px;" value="#{escolaController.uf}" converter="ufConverter">
		<f:selectItem itemLabel="Selecione..." itemValue="" />
		<f:selectItems value="#{escolaController.listUF()}" var="u" itemValue="#{u}" itemLabel="#{escolaController.uf.descricao}" />
</p:selectOneMenu>
Converter:
@FacesConverter(value = "ufConverter")
public class UFConverter implements Converter {
	
	private List<UF> lista;
	private UFDAO ufdao;
	
	public UFConverter() {
		
		lista = new ArrayList<UF>();
		ufdao = new UFDAO();
	}

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if (value != null && !value.equals("")) {
						
			
			lista = ufdao.getList();
			
			for (UF uf : lista) {
				
				if (uf.getUf().equals(value)) {
					
					return uf;
				}
			}
		}
		
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if (value instanceof UF) {
			return ((UF)value).getUf();
		}
		return "";
	}

Pelo visto muitos passaram por isso, no mesmo form tenho outro combo, a diferença é que esse outro
é populado com dados oriundos de uma classe sem acesso ao banco.

Problema de escopo novamente?

Alguém?

Falews.

25 Respostas

rafadelnero

Intancia sua variável UFDAO e vê se dá certo!

private UFDAO ufdao = new UFDAO();
UpTheIrons

Bom dia rafadelnero,

Deu certo não, até piorou rs, nem carregou o combo e ainda veio isso de quebra quando tento executar:

Polverini

É que sua lista provavelmente esta indo nula para a view, tenta isso:

public List<UF> listUF() {  
           ufs = ufDAO.getList();  
            if (ufs == null) {            
                ufs = new ArrayList<>();
            }  
            return ufs;  
        }
CristianPalmaSola10

o problema não esta nesse trecho

&lt;p:selectOneMenu id="cboUF" style="width: 150px;" value="#{escolaController.uf}" converter="ufConverter"&gt;  
        &lt;f:selectItem itemLabel="Selecione..." itemValue="" /&gt;  
        &lt;f:selectItems value="#{escolaController.listUF()}" var="u" itemValue="#{u}" itemLabel="#{escolaController.uf.descricao}" /&gt;  
&lt;/p:selectOneMenu&gt;

o correto naum seria isso

&lt;p:selectOneMenu id="cboUF" style="width: 150px;" value="#{escolaController.uf}" converter="ufConverter"&gt;  
        &lt;f:selectItem itemLabel="Selecione..." itemValue="" /&gt;  
        &lt;f:selectItems value="#{escolaController.ufs}" var="u" itemValue="#{u}" itemLabel="#{u.descricao}" /&gt;  
&lt;/p:selectOneMenu&gt;

acho que assim funciona tenta ai e boa sorte…

UpTheIrons

Polverini, Cristian,

Nâo, ainda não deu certo.

Cacetada!!!

CristianPalmaSola10

Bom voce poderia postar a classe UFDAO e tambem poderia debugala pois como podemos ver o erro primeiro aconteceu no seu converter e depois na classe UFDAO

faz um teste aqui o

public Object getAsObject(FacesContext context, UIComponent component, String value) {  
        if (value != null && !value.equals("")) {  
                          
              if(ufdao == null) {
                    System.out.println("ufdao nulo");
                    return null;
              }

            lista = ufdao.getList();  
              
            for (UF uf : lista) {  
                  
                if (uf.getUf().equals(value)) {  
                      
                    return uf;  
                }  
            }  
        }  
          
        return null;  
    }

veja se ajuda …

UpTheIrons

Cristian,

Eu acho q o erro n está na DAO pq ela funciona pra outras classes e até pra essa mesmo, ela
carrega os dados inicialmente, dpois que dá zona…

Método da GenericDAO

// GetAll com paginação
	@SuppressWarnings({ "unchecked", "hiding", "rawtypes" })
	protected <T> List<T> getListAll(Integer firstRsult, Integer maxResult, String ordem) {

		CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
		CriteriaQuery cq = builder.createQuery(entityClass);
		Root from = cq.from(entityClass);

		cq.select(cq.from(entityClass)).orderBy(builder.asc(from.get(ordem)));

		try {
			Query q = getEntityManager().createQuery(cq);
			if (firstRsult != null) {
				q.setFirstResult(firstRsult);
				q.setMaxResults(maxResult);
			}

			return q.getResultList();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		return null;
	}

Método da UFDAO

@Override
	public List<UF> getList() {
		
		return getListAll(null, null, "uf");
	}
CristianPalmaSola10

Mas e ai fez o teste que de pedi, qual foi o resultado ?

UpTheIrons

Acabei de fazer, nem chega no converter.

Chega, mas o dao n é nulo.

UpTheIrons

O erro tá acontecendo após um item da lista ter sido selecionado.

Hebert_Coelho

Cara, vou olhar o que o erro diz:

at br.com.orionti.sige.dao.GenericDAO.getListAll(GenericDAO.java:148) Essa linha deu o erro. O que tem aí?

UpTheIrons

Bom dia Hebert,

CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();

É o q tá na linha 148.

Hebert_Coelho

UpTheIrons:
Bom dia Hebert,

CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();

É o q tá na linha 148.

getEntityManager() tá instanciado?

UpTheIrons
No UFDAO
@PersistenceContext
	private EntityManager em;
	
	public UFDAO() {
		super(UF.class);		
	}
public abstract class GenericDAO<T> {

	protected abstract EntityManager getEntityManager();

	private Class<T> entityClass;

	public GenericDAO(Class<T> entityClass) {
		this.entityClass = entityClass;
	}
....

Ela funciona normalmente, a princípio, carrega o "combo", mas quando um item é selecionado
que tá dando esta zica!

Hebert_Coelho
UpTheIrons:
No UFDAO
@PersistenceContext
	private EntityManager em;
	
	public UFDAO() {
		super(UF.class);		
	}
public abstract class GenericDAO<T> {

	protected abstract EntityManager getEntityManager();

	private Class<T> entityClass;

	public GenericDAO(Class<T> entityClass) {
		this.entityClass = entityClass;
	}
....

Ela funciona normalmente, a princípio, carrega o "combo", mas quando um item é selecionado
que tá dando esta zica!

O método que carrega o combo, está pegando esse cara null. Você debugou para ver se esse cara está ou não null?

UpTheIrons

Acabei de ver aqui, ele tá ficando null…

Hebert_Coelho

UpTheIrons:
Acabei de ver aqui, ele tá ficando null…
Quando for ver um erro cara, não fique em tentativa… trocar um código sem saber o real motivo de problema vai te levar a outras coisas…

Veja se o método que troca combo está chamando essa classe como deveria. Se você chama a classe pelo browser, vai rolar injection pra tu. Mas se você faz isso por algum método interno, não vai rolar injection…

UpTheIrons

Mas eu só testei o que eu já tinha usado e como o cenário é o mesmo e eu já tinha testado, pra mim tava tudo ok,
só que n vai de forma alguma.

E a classe nem haveria pq ser chamada novamente, ela já carregou o combo, n precisaria mais dela, por isso uso
até uma dica q vc mesmo deu em outro post meu, algo como:

public List<UF> listUF() {
		if (ufs == null) {
			ufs = ufDAO.getList();			
			return ufs;
		}
		return ufs;
        
	}

O problema tá após selecionar um item do combo, que já estava prontinho e ao clicar em qq botão, ele faz um
“request” zerando o “ufs” e tenta carregá-lo novamente.

Vou futucar esta p… aqui, já tem bem umas 15h de atraso, mas td bem, vamo q vamo!

Hebert_Coelho
UpTheIrons:
Mas eu só testei o que eu já tinha usado e como o cenário é o mesmo e eu já tinha testado, pra mim tava tudo ok, só que n vai de forma alguma.

E a classe nem haveria pq ser chamada novamente, ela já carregou o combo, n precisaria mais dela, por isso uso
até uma dica q vc mesmo deu em outro post meu, algo como:

public List<UF> listUF() {
		if (ufs == null) {
			ufs = ufDAO.getList();			
			return ufs;
		}
		return ufs;
        
	}
O problema tá após selecionar um item do combo, que já estava prontinho e ao clicar em qq botão, ele faz um "request" zerando o "ufs" e tenta carregá-lo novamente.

Vou futucar esta p.. aqui, já tem bem umas 15h de atraso, mas td bem, vamo q vamo!

Não é só pq funcionou uma vez que vá funcionar sempre. =P

Esse novo request pode estar fazendo algo totalmente diferente. Veja qual método está chamado esse lugar que deu nullpointer. ele é o motivo.

Você consegue. [=

UpTheIrons

Apoio moral é importante, sempre! :slight_smile:

Rodrigo_Sasaki


Hehehehe, brincadeira :slight_smile:

UpTheIrons

Um dia faço uma brincadeira tb rsrs

UpTheIrons

A solução pra mim foi essa, ao menos por enquanto.

Falews! :slight_smile:

UpTheIrons

Só pra constar, não resolveu, vou tirar os combos da aplicação rs.

n10

uma dica para você usar converter (um converter genérico).

Criado 23 de janeiro de 2013
Ultima resposta 24 de jan. de 2013
Respostas 25
Participantes 7