Problemas com o JSF <selectItems>

8 respostas
jximenes

Pessoal..

Estou começando a estudar um pouco de JSF e me deparei com um probleminha... eu quero converter um valor em real para dolar.. por exemplo, mas quando eu clico no botao para executar a action esta dando nullPointer

XHTML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</h:head>
<h:body>

	<h:form>
	
		<h:commandButton value="Converter" action="#{conversorMonetarioBean.converte}"/>
		
		<h:inputText value="#{conversorMonetarioBean.de}"/>
		
		<h:outputLabel value="de" for="de"/>
		<h:selectOneMenu value="conversorMonetarioBean.de" id="de">
		
			<f:selectItems value="#{conversorMonetarioBean.taxas}" var="moeda" itemValue="#{moeda}" itemLabel="#{moeda}"/>
					
		
		</h:selectOneMenu>
		
		<h:outputLabel value="para" for="para"/>
		<h:selectOneMenu value="#{conversorMonetarioBean.para}" id="para">
		
			<f:selectItems value="#{conversorMonetarioBean.taxas}" var="moeda" itemValue="#{moeda}" itemLabel="#{moeda}"/>
		
		</h:selectOneMenu>
	
	</h:form>
	
	Resultado: #{conversorMonetarioBean.resultado}

</h:body>
</html>

Classe Bean:

@ManagedBean
public class ConversorMonetarioBean {
	
	private String de;
	private String para;
	private Double valor;
	
	private Double resultado;
	
	private Map<String,Double> taxas = new LinkedHashMap<String,Double>();
	
	
	public ConversorMonetarioBean() {

		this.taxas.put("Real",1.0);
		this.taxas.put("Euro",2.33);
		this.taxas.put("Peso argentino",0.42);
		this.taxas.put("Dólar americano",1.84);
		
			
	}
	
	public void converte(){
		
		this.resultado = this.valor * this.taxas.get(this.de)/this.taxas.get(this.para);
		
	}

	public String getDe() {
		return de;
	}

	public void setDe(String de) {
		this.de = de;
	}

	public String getPara() {
		return para;
	}

	public void setPara(String para) {
		this.para = para;
	}

	public Double getValor() {
		return valor;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public Double getResultado() {
		return resultado;
	}

	public void setResultado(Double resultado) {
		this.resultado = resultado;
	}

	public Map<String, Double> getTaxas() {
		return taxas;
	}

	public void setTaxas(Map<String, Double> taxas) {
		this.taxas = taxas;
	}
	
	
	
	

}

Erro:

type Exception report

message

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

exception

javax.servlet.ServletException: java.lang.NullPointerException
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

root cause

javax.faces.el.EvaluationException: java.lang.NullPointerException
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	javax.faces.component.UICommand.broadcast(UICommand.java:315)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	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)

root cause

java.lang.NullPointerException
	ConversorMonetarioBean.converte(ConversorMonetarioBean.java:30)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	javax.faces.component.UICommand.broadcast(UICommand.java:315)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	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 Apache Tomcat/6.0.20 logs.

Se alguem puder me ajudar.. eu agradeço muitooo

8 Respostas

evertonsilvagomesjav

um problema que eu ja vi aqui e seu value

<h:selectOneMenu value="conversorMonetarioBean.de" id="de">

Ta sem expression language seria

<h:selectOneMenu value="#{conversorMonetarioBean.de}" id="de">
jximenes

ja arrumei… mas o problema continua

Hebert_Coelho

Oq tem aqui? ConversorMonetarioBean.converte(ConversorMonetarioBean.java:30)

jximenes

eu acho q nao esta populando algum atributo meu…
nele era pra pegar o valor digitado no campo text * o valor do de / valor do para

Hebert_Coelho

Cara, você ta usando um selectOne para pegar uma moeda. Taxa é um objeto? Ou uma string/integer? Se for objeto você precisa de um converter.

Outra coisa, seu metodo converte coloque-o como public String e depois retorn null; para que ele possa funcionar como uma action.

Hebert_Coelho

Nesse post tem um hello world mostrando como realizar uma soma, talvez te ajude: JSF - Hello World, AutoComplete.

W

Bom dia!
Estou com o mesmo problema.
As possíveis soluções acim n surtiram efeito…

Mais alguém, please!

allanroberto18
<h:selectOneMenu value="#{conversorMonetarioBean.para}" id="para">
	<f:selectItems 
		value="#{conversorMonetarioBean.taxas.keySet()}" 
		var="moeda" 
		itemValue="#{moeda}" 
		itemLabel="#{moeda}"
	/>
</h:selectOneMenu>

Essa é a forma correta do seu h:selectOneMenu e do sue selectItems. Eles que estão zicando a parada…

Criado 31 de março de 2012
Ultima resposta 21 de set. de 2012
Respostas 8
Participantes 5