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:
[quote]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
…
[/quote]
controller:
[code]public List listUF() {
if (ufs == null) {
ufs = ufDAO.getList();
return ufs;
}
return ufs;
}[/code]
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>[/code]
Converter:
[code]@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.
Intancia sua variável UFDAO e vê se dá certo!
private UFDAO ufdao = new UFDAO();
Bom dia rafadelnero,
Deu certo não, até piorou rs, nem carregou o combo e ainda veio isso de quebra quando tento executar:
É 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;
}
o problema não esta nesse trecho
<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>
o correto naum seria isso
<p:selectOneMenu id="cboUF" style="width: 150px;" value="#{escolaController.uf}" converter="ufConverter">
<f:selectItem itemLabel="Selecione..." itemValue="" />
<f:selectItems value="#{escolaController.ufs}" var="u" itemValue="#{u}" itemLabel="#{u.descricao}" />
</p:selectOneMenu>
acho que assim funciona tenta ai e boa sorte…
Polverini, Cristian,
Nâo, ainda não deu certo.
Cacetada!!!
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 …
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");
}
Mas e ai fez o teste que de pedi, qual foi o resultado ?
Acabei de fazer, nem chega no converter.
Chega, mas o dao n é nulo.
O erro tá acontecendo após um item da lista ter sido selecionado.
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í?
Bom dia Hebert,
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
É o q tá na linha 148.
[quote=UpTheIrons]Bom dia Hebert,
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
É o q tá na linha 148.[/quote]getEntityManager() tá instanciado?
No UFDAO
[code]
@PersistenceContext
private EntityManager em;
public UFDAO() {
super(UF.class);
}[/code]
[code]public abstract class GenericDAO {
protected abstract EntityManager getEntityManager();
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
…[/code]
Ela funciona normalmente, a princípio, carrega o “combo”, mas quando um item é selecionado
que tá dando esta zica!
[quote=UpTheIrons]No UFDAO
[code]
@PersistenceContext
private EntityManager em;
public UFDAO() {
super(UF.class);
}[/code]
[code]public abstract class GenericDAO {
protected abstract EntityManager getEntityManager();
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
…[/code]
Ela funciona normalmente, a princípio, carrega o “combo”, mas quando um item é selecionado
que tá dando esta zica![/quote]O método que carrega o combo, está pegando esse cara null. Você debugou para ver se esse cara está ou não null?
Acabei de ver aqui, ele tá ficando null…
[quote=UpTheIrons]Acabei de ver aqui, ele tá ficando null…[/quote]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…
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!
[quote=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:
[code]
public List listUF() {
if (ufs == null) {
ufs = ufDAO.getList();
return ufs;
}
return ufs;
}
[/code]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![/quote]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. [=