Primeiro Topico - Ajuda com JSF [RESOLVIDO]

13 respostas
M

Pessoal este é meu primeiro topico aqui no forum e ja peço desculpas por alguma falha que eu possa vir a cometer
Seguinte, estou estudando JSF e estou com um erro que não estou conseguindo resolver.

Abaixo a descrição:

É um exercicio da apostial da K19, no qual inserido um numero na primeira view, o bean deve devolver um numero aleatorio entre 0 e o numero inserido na segunda view.
O erro ocorre quando clico no commandbutton que deveria chamar o metodo GeraNumeroAleatorio no bean.

Bean

package bean;
import javax.faces.bean.ManagedBean;

@ManagedBean
public class NumeroAleatorioBean {
public int maximo;
public int numeroAleatorio;

	public String geraNumeroAleatorio(){
		this.numeroAleatorio= (int)(Math.random()*this.maximo);
		return "Resposta";
	}
	
	public void setMaximo(int maximo){
		this.maximo = maximo;
	}
	
	public int getNumeroAleatorio(){
		return this.numeroAleatorio;
	}
}

Primeira view:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>Gera Numero Aleatorio</h:head>

<h:body>
	<h:form>
	<h:outputLabel value="Numero Maximo" />
	<h:inputText value="#{bean.numeroAleatorioBean.maximo}" />
	<h:commandButton value="Gera Numero Aleatorio" action="#{bean.numeroAleatorioBean.geraNumeroAleatorio}" />
	</h:form>
</h:body>

</html>

Segunda View:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>Gera Numero Aleatorio</h:head>
<h:body>
	<h:outputText value="#{bean.numeroAleatorioBean.numeroAleatorio}" />
</h:body>



</html>

Erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /Formulario.xhtml @12,60 value="#{bean.numeroAleatorioBean.maximo}": Target Unreachable, identifier 'bean' resolved to null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

root cause

javax.el.PropertyNotFoundException: /Formulario.xhtml @12,60 value="#{bean.numeroAleatorioBean.maximo}": Target Unreachable, identifier 'bean' resolved to null
com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
javax.faces.component.UIInput.validate(UIInput.java:960)
javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
javax.faces.component.UIInput.processValidators(UIInput.java:698)
javax.faces.component.UIForm.processValidators(UIForm.java:253)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

note The full stack trace of the root cause is available in the JBoss Web/7.0.13.Final logs.
JBoss Web/7.0.13.Final

Eu sei que é um erro simples, mas ja pesquisei bastante e não consegui resolver.

Abraço a todos.

13 Respostas

H

Altere sua anotação no managed bean @ManagedBean para @ManagedBean(name = “bean”).

Espero ter ajudado.

fabiozanardi

tente nomear seu bean corretamente na anotação

@ManagedBean (name="bean")
public class NumeroAleatorioBean {.....
lele_vader

Você está chamando o bean errado, veja o nome do seu bean é NumeroAleatorioBean e você colocou nas páginas bean.numeroAleatorioBean

troque para numeroAleatorioBean.seu metodo

M

Amigos, apesar do apoio o erro persiste.

henriquejhc, fabiozanardi e lele_vader , fiz as duas alterações sugeridas mas o erro continua. Apenas uma observação, o NumeroAleatorioBean esta dentro do pacote bean que eu criei, por isso usei a expression language bean.numeroAleatorioBean.maximo

Mas mesmo assim, muito obrigado pela força.

lele_vader

se você tirar o bean e mudar para numeroAleatorioBean.maximo, sem mudar nada no seu managed bean, qual o erro executado ?
O managedBean por default você o referencia na página com o nome dele em camel case, ou se você definir o name como alguns mostraram.
Além disso não falta um get para o atributo maximo ?

Coloque assim as telas

<h:inputText value="#{numeroAleatorioBean.maximo}" />  
    <h:commandButton value="Gera Numero Aleatorio" action="#{numeroAleatorioBean.geraNumeroAleatorio}" />
[code]
fabiozanardi

também não vejo motivo para o erro continuar, tente limpar os arquivos .class e gera novamente, se estiver usando eclipse e só da 1 clean

caso o problema persista posta para a gente

abraço

fabiozanardi

mais 1 coisinha, vi agora isso:

&lt;h:outputText value="#{bean.numeroAleatorioBean.numeroAleatorio}" /&gt;

apenas deixe ou com o nome do bean, ou com o name que voce der
se seguir o padrão

@ManagedBean (name="bean")  
public class NumeroAleatorioBean {.....

deixe como

&lt;h:outputText value="#{bean.numeroAleatorio}" /&gt;
M

lele_vader:
se você tirar o bean e mudar para numeroAleatorioBean.maximo, sem mudar nada no seu managed bean, qual o erro executado ?
O managedBean por default você o referencia na página com o nome dele em camel case, ou se você definir o name como alguns mostraram.
Além disso não falta um get para o atributo maximo ?

Coloque assim as telas

<h:inputText value="#{numeroAleatorioBean.maximo}" />  
    <h:commandButton value="Gera Numero Aleatorio" action="#{numeroAleatorioBean.geraNumeroAleatorio}" />
<h:outputText value="#{numeroAleatorioBean.numeroAleatorio}" />

Lele_vader, fiz as seguintes alterações conforme voce sugeriu:

Primeira View (Formulario.xhtml):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>Gera Numero Aleatorio</h:head>

<h:body>
	<h:form>
	<h:outputLabel value = "Numero Maximo" />
	<h:inputText value = "#{numeroAleatorioBean.maximo}" />
	<h:commandButton value ="Gera Numero Aleatorio" action= "#{numeroAleatorioBean.geraNumeroAleatorio}" />
	</h:form>
</h:body>

</html>

Segunda View(Resposta.xhtml):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>Gera Numero Aleatorio</h:head>
<h:body>
	<h:outputText value="#{numeroAleatorioBean.numeroAleatorio}" />
</h:body>



</html>

Erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /Formulario.xhtml @11,57 value="#{numeroAleatorioBean.maximo}": The class ‘bean.NumeroAleatorioBean’ does not have a readable property ‘maximo’.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

root cause

javax.el.PropertyNotFoundException: /Formulario.xhtml @11,57 value="#{numeroAleatorioBean.maximo}": The class bean.NumeroAleatorioBean does not have a readable property maximo.

com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)

javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)

javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)

javax.faces.component.UIOutput.getValue(UIOutput.java:169)

com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)

com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)

com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)

javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)

javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)

javax.faces.render.Renderer.encodeChildren(Renderer.java:168)

javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)

javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)

javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)

javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)

com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)

com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)

com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)

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

com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)

javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)

note The full stack trace of the root cause is available in the JBoss Web/7.0.13.Final logs.
JBoss Web/7.0.13.Final

M

Lele_vader, quanto ao getMaximo, eu entendi que não era necessario pelo seguinte raciocinio:

O metodo setMaximo seta o valor no atributo maximo:

public void setMaximo(int maximo){ this.maximo = maximo; }

O metodo GeraNumeroAleatorio seta o numero gerado no atributo numeroAleatorio

public String geraNumeroAleatorio(){
		this.numeroAleatorio= (int)(Math.random()*this.maximo);
		return "Resposta";
	}

e o metodo getNumeroAleatorio retorna a view o valor do atributo numeroAleatorio

public int getNumeroAleatorio(){
		return this.numeroAleatorio;
	}

Ou to falando um monte de besteira? :shock:

lele_vader

É por conta do ciclo de vida do jsf.
Olha o erro.

The class ‘bean.NumeroAleatorioBean’ does not have a readable property ‘maximo’.
Aí diz que você não tem uma propriedade de leitura de maximo, o que seria o método getMaximo.

Eu acho que você pode ter somente leitura, porém somente escrita acho que não.
O que poderia é o seu método sobrescrever o setMaximo.

Gleidson_Henrique

Segue o codigo para voce fazer os testes...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:ui="http://java.sun.com/jsf/facelets">  
<h:head></h:head>  
  
<h:body>  
    <h:form>  
    <h:outputLabel value="Numero Maximo" />  
    <h:inputText value="#{numeroAleatorioBean.maximo}" />  
    <h:commandButton value="Gera Numero Aleatorio" action="#{numeroAleatorioBean.geraNumeroAleatorio}" />
    <h:outputLabel value="#{numeroAleatorioBean.numeroAleatorio}" />
    </h:form>
</h:body>  
  
</html>
import javax.faces.bean.ManagedBean;  
  
@ManagedBean  
public class NumeroAleatorioBean {  
public int maximo;  
public int numeroAleatorio;  
  
    public String geraNumeroAleatorio(){  
        this.numeroAleatorio= (int)(Math.random()*this.maximo);  
        return  String.valueOf("4");  
    }  
      
    public void setMaximo(int maximo){  
        this.maximo = maximo;  
    }
      
    public int getNumeroAleatorio(){  
        return this.numeroAleatorio;  
    }  
}

Abraços

H

Tente assim.

Página.

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;  
&lt;html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:ui="http://java.sun.com/jsf/facelets"&gt;  
&lt;h:head&gt;&lt;/h:head&gt;  
  
&lt;h:body&gt;  
    &lt;h:form&gt;  
       &lt;h:outputLabel value="Numero Maximo" /&gt;  
       &lt;h:inputText value="#{numeroAleatorioBean.maximo}" /&gt;  
       &lt;h:commandButton value="Gera Numero Aleatorio" action="#{numeroAleatorioBean.geraNumeroAleatorio}" /&gt;
    &lt;/h:form&gt;
&lt;/h:body&gt;  
  
&lt;/html&gt;

Managed bean.

import javax.faces.bean.ManagedBean;  
  
@ManagedBean  
public class NumeroAleatorioBean {  
    
    private int maximo;  
    private int numeroAleatorio;  
  
    public String geraNumeroAleatorio(){  
        this.numeroAleatorio= (int)(Math.random()*this.maximo);  
        return  "Resposta";  
    }  
      
    public void setMaximo(int maximo){  
         this.maximo = maximo;  
    }

    public int getMaximo(){
         return maximo;
    }

    public void setNumeroAleatorio(int numeroAleatorio){
         this.numeroAleatorio = numeroAleatorio;
    }
      
    public int getNumeroAleatorio(){  
        return this.numeroAleatorio;  
    }  
}

Espero ter ajudado.

M

Galera resolvido com a sugestão do henriquejhc, Valeu Henrique.
Só teve um porem, eu precisei tirar o NumeroAleatoriobean do pacote bean que eu tinha criado e deixei ele no Defalut Package na pasta SRC, mas funcionou legal.

Vou alterar o titulo da Thread para resolvido.

Abração a todos.

Criado 20 de setembro de 2012
Ultima resposta 24 de set. de 2012
Respostas 13
Participantes 5