Livro Aplicações Java para Web JSF e JPA

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

[code]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[/code]

Aqui as classes

[code]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;
}

}
[/code]

[code]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();
}

}
[/code]

[code]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();
}

}
[/code]

Página de cadastro

[code]

Marca:
Modelo:
Ano de Fabricação:
Ano do Modelo:
Observações:

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

[/code]

Agradeço a ajuda.

Altere na página de cadastro

para

Mudei mas o erro persiste.

seu managedBean necessariamente precisa implementar o serializable.

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

Qual a ideia de fazer isso?

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

É verdade,

coloque:

e

Explicação do livro

[quote]
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)}[/quote]

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

[quote=rafaelpc]Explicação do livro

[quote]
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)}[/quote][/quote]

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

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

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á?

Ele já colocou a anotação
@ManagedBean

É verdade,

coloque:

e

[/quote]

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

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

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.

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

em qual literatura está escrito isso?

Estou usando esse endereço para acessar

Como faz isso mais especificamente?

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

[quote=kleberdamasco][quote]
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
[/quote]
em qual literatura está escrito isso?[/quote]
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