Livro Aplicações Java para Web JSF e JPA

20 respostas
R

Senhores boa tarde, estou com o seguinte erro ao tentar salvar.

HTTP Status 500 - /cadastroAutomovel.xhtml @7,64 value="#{automovelBean.automovel.marca}": Target Unreachable, identifier 'automovelBean' resolved to null

type Exception report

message /cadastroAutomovel.xhtml @7,64 value="#{automovelBean.automovel.marca}": Target Unreachable, identifier 'automovelBean' resolved to null

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

exception

javax.servlet.ServletException: /cadastroAutomovel.xhtml @7,64 value="#{automovelBean.automovel.marca}": Target Unreachable, identifier 'automovelBean' resolved to null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:653)
root cause

javax.el.PropertyNotFoundException: /cadastroAutomovel.xhtml @7,64 value="#{automovelBean.automovel.marca}": Target Unreachable, identifier 'automovelBean' 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.UIComponentBase.processValidators(UIComponentBase.java:1214)
	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:1169)
	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:181)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:640)
root cause

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'automovelBean' resolved to null
	org.apache.el.parser.AstValue.getTarget(AstValue.java:98)
	org.apache.el.parser.AstValue.getType(AstValue.java:82)
	org.apache.el.ValueExpressionImpl.getType(ValueExpressionImpl.java:172)
	com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:98)
	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.UIComponentBase.processValidators(UIComponentBase.java:1214)
	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:1169)
	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:181)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:640)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.37 logs.

Apache Tomcat/7.0.37

Aqui as classes

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Automovel {

	@Id
	@GeneratedValue
	private Long id;
	private String marca;
	private String modelo;
	private Integer anoFabricacao;
	private Integer anoModelo;
	private String observacoes;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getMarca() {
		return marca;
	}
	public void setMarca(String marca) {
		this.marca = marca;
	}
	public String getModelo() {
		return modelo;
	}
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
	public Integer getAnoFabricao() {
		return anoFabricacao;
	}
	public void setAnoFabricacao(Integer anoFabricacao) {
		this.anoFabricacao = anoFabricacao;
	}
	public Integer getAnoModelo() {
		return anoModelo;
	}
	public void setAnoModelo(Integer anoModelo) {
		this.anoModelo = anoModelo;
	}
	public String getObservacoes() {
		return observacoes;
	}
	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}
	
	
	
}
import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManager;

@ManagedBean
public class AutomovelBean {

	private Automovel automovel = new Automovel();

	public Automovel getAutomovel() {
		return automovel;
	}

	public void setAutomovel(Automovel automovel) {
		this.automovel = automovel;
	}
	
	public void salva(){
		EntityManager em = JPAUtil.getEntityManager();
		em.getTransaction().begin();
		em.persist(automovel);
		em.getTransaction().commit();
		em.close();
	}
}
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class JPAUtil {

	private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("default");
	
	public static EntityManager getEntityManager(){
		return emf.createEntityManager();
	}
}

Página de cadastro

<!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">
<h:body>
<h:form>
<h:panelGrid columns="2">
Marca: <h:inputText value="#{automovelBean.automovel.marca}" /><br/>
Modelo: <h:inputText value="#{automovelBean.automovel.modelo}"/><br/>
Ano de Fabricação: <h:inputText value="#{automovelBean.automovel.anoFabricacao}"/><br/>
Ano do Modelo: <h:inputText value="#{automovelBean.automovel.anoModelo}"/><br/>
Observações: <h:inputTextarea value="#{automovelBean.automovel.observacoes}"/><br/>

<h:commandButton action="#{automovelBean.salva(automovelBean.automovel)}" value="Salvar" />
</h:panelGrid>
</h:form>
</h:body>
</html>

Agradeço a ajuda.

20 Respostas

W

Altere na página de cadastro

para

R

Mudei mas o erro persiste.

K

seu managedBean necessariamente precisa implementar o serializable.

V

Por favor, ao postar tópicos, não utilize tags óbvias como [Ajuda] ou [Dúvida].

K

Qual a ideia de fazer isso?

<h:commandButton action="#{automovelBean.salva(automovelBean.automovel)}" value="Salvar" />

W

É verdade,

coloque:

e

R

Explicação do livro


A partir da Expression
Language 2.2, utilizado pelo JBoss 7 e oTomcat 7, por exemplo, não precisamos mais
do setter. Com isso, é possível fazer com que o método definido na action do botão
receba o parâmetro.
Dessa maneira, teremos no método salva um novo parâmetro do tipo
Automovel, e no xhtml vamos referenciá-lo através do automovel do Managed Bean:
#{automovelBean.salva(automovelBean.automovel)}

W

Sua bean foi adcionada no faces-config ou você colocou alguma anotação JSF para que a aplicação entenda que ela é uma bean?

W

rafaelpc:
Explicação do livro


A partir da Expression
Language 2.2, utilizado pelo JBoss 7 e oTomcat 7, por exemplo, não precisamos mais
do setter. Com isso, é possível fazer com que o método definido na action do botão
receba o parâmetro.
Dessa maneira, teremos no método salva um novo parâmetro do tipo
Automovel, e no xhtml vamos referenciá-lo através do automovel do Managed Bean:
#{automovelBean.salva(automovelBean.automovel)}

Mas creio que isso funcionaria se seu método fosse public void salva(Automovel automovel)

W

coloque a anotação @ManagedBean em sua bean e teste

K

Eu sei que pode passar parametro,
perguntei pq
conforme seu método salva

public void salva(){  
        EntityManager em = JPAUtil.getEntityManager();  
        em.getTransaction().begin();  
        em.persist(automovel);  
        em.getTransaction().commit();  
        em.close();  
    }

ele não recebe parametros certo?
então pra que passar lá?

W

Ele já colocou a anotação
@ManagedBean

D

É verdade,

coloque:

e

so é necessario implementar Serializable se seu managedBean for um sessionScoped ou viewScoped ou AplicationScoped
quando se coloca apenas a anotação @ManagedBean ele é por padrão requestScoped no requestScoped não é obrigatorio implementar Serializable

agora o que vc esta tendo é o famoso nullpointeExption do jsf

que pode ocorrer se o jsf não conseguir relacionar o managedBean com a pagina ou algum atributo do managedBean que esta relacionado com o xhtml estiver nullo

D

até onde eu pude ver esta tudo certo, tirando a chamado do salvar que o pessoal já comentou

tenta tirar o projeto do servidor de aplicação da um clean e depois adiciona o projeto novamente

G

Olá pessoal, acho que faltou alterar o managed bean para ele corresponder à explicação da EL com parâmetro.
Você pode seguir o código de exemplo para se basear https://github.com/gscordeiro/faces-motors/blob/master/src/br/com/casadocodigo/jsfjpa/controllers/AutomovelBean.java
Ou até mesmo clonar o repositório pra já dar umas testadas.

G

Você está visitando a página por qual endereço? Você está usando .jsf ou /faces/ ?

K

em qual literatura está escrito isso?

R

Estou usando esse endereço para acessar

Como faz isso mais especificamente?

Eu já clonei o projeto mas prefiro sofrer pra aprender :smiley:

D

kleberdamasco:

so é necessario implementar Serializable se seu managedBean for um sessionScoped ou viewScoped ou AplicationScoped
quando se coloca apenas a anotação @ManagedBean ele é por padrão requestScoped no requestScoped não é obrigatorio implementar Serializable

em qual literatura está escrito isso?

Corrigindo, implementar serializable so é necessario se vc configurar o jsf pra armazenar o estado da arvore de componentes no cliente.

O Que falei anteriormente é valido se vc estiver usando cdi com jsf

R

Consegui!!!! Aparentemente o erro era no método salvar mesmo.

public String salvar(Automovel auto) {
		EntityManager em = JPAUtil.getEntityManager();
		em.getTransaction().begin();
		em.persist(auto);
		em.getTransaction().commit();
		
		
		FacesMessage msg = new FacesMessage("Automovel salvo com sucesso!");
		FacesContext.getCurrentInstance().addMessage(null, msg);
		
		em.close();
		return "listar";
	}

o xhtml ficou assim:

&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"&gt;
&lt;h:body&gt;
&lt;h:form&gt;
&lt;h:panelGrid columns="2"&gt;
Marca: &lt;h:inputText value="#{automovelBean.automovel.marca}" /&gt;<br/>
Modelo: &lt;h:inputText value="#{automovelBean.automovel.modelo}"/&gt;<br/>
Ano de Fabricação: &lt;h:inputText value="#{automovelBean.automovel.anoFabricacao}"/&gt;<br/>
Ano do Modelo: &lt;h:inputText value="#{automovelBean.automovel.anoModelo}"/&gt;<br/>
Observações: &lt;h:inputTextarea value="#{automovelBean.automovel.observacoes}"/&gt;<br/>

&lt;h:commandButton action="#{automovelBean.salvar(automovelBean.automovel)}" value="Salvar" /&gt;
&lt;/h:panelGrid&gt;
&lt;/h:form&gt;
&lt;/h:body&gt;
&lt;/html&gt;

Obrigado ai :)

Criado 3 de abril de 2013
Ultima resposta 4 de abr. de 2013
Respostas 20
Participantes 7