Problemas com jsf 2

5 respostas
R

Bom dia estou tendo uma dificuldade ao fazer um exemplo que peguei na apostila da K19 sobre JPA2 e JSF 2.

O meu managedbean vem como null e ocorre o seguinte erro:

AVISO: /carros.xhtml @17,69 value="#{carroBean.carro.marca}": Target Unreachable, identifier ‘carroBean’ resolved to null
javax.el.PropertyNotFoundException: /carros.xhtml @17,69 value="#{carroBean.carro.marca}": Target Unreachable, identifier ‘carroBean’ resolved to null

Vou postar o código abaixo para quem puder me ajudar vou agradecer bastante.

Tenho minha classe Carro:

@Entity
public class Carro {

	@Id
	@GeneratedValue
	private Long id;
	private String marca;
	private String modelo;
	
	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;
	}

Minha Classe CarroBean:

@ManagedBean
public class CarroBean {
	
	private Carro carro = new Carro();
	
	public void adicionaCarro() {
		EntityManager manager = this.getEntityManager();
		CarroRepository repository = new CarroRepository(manager);
		
		repository.adiciona(carro);
		this.carro = new Carro();
	}
	
	public List<Carro> getCarros() {
		EntityManager manager = this.getEntityManager();
		CarroRepository repository = new CarroRepository(manager);
		return repository.buscaTodos();
	}
	
	private EntityManager getEntityManager(){
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		EntityManager manager = (EntityManager) request.getAttribute("EntityManager");
		
		return manager;
	}

	public Carro getCarro() {
		return carro;
	}

	public void setCarro(Carro carro) {
		this.carro = carro;
	}

e a página carros.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">

<h:head>
	<title>Projeto Carros</title>
</h:head>
<h:body>
	<h:form>
		<h:panelGrid columns="2">
			<h:outputLabel value="Marca: " for="campo-marca"/>
			<h:inputText value="#{carroBean.carro.marca}" id="campo-marca" />
			
			<h:outputLabel value="Modelo: " for="campo-modelo" />
			<h:inputText value="#{carroBean.carro.modelo}" id="campo-modelo" />
			
			<h:commandButton value="Adicionar" action="#{carroBean.adicionaCarro}"/>
		</h:panelGrid>
	</h:form>
	
</h:body>

Obrigado pela ajuda de todos.

5 Respostas

lucasmadeira

Defina o nome do ManagedBean na anotação @ ManagedBean vai ficar assim @ManagedBean(name=“carroBean”) e coloca a anotação do escopo (@SessionScoped, @ViewScoped, @ApplicationScoped…da uma estuda se não sabe a diferença entre elas existem outras)

R

lucasmadeira, quando utilizamos a anotação @ManagedBean por padrão do JSF 2 ela ja tem o escopo de requisição: @RequestScoped, mas defini no meu bean e continua com o mesmo erro …

Se alguem puder me ajudar tb agradeço.

lucasmadeira

Sim vem por padrão, mas é bom saber a diferença entre os escopos, essas apostilas as vezes não cobrem tudo.

Target Unreachable, identifier ‘carroBean’ resolved to null ele não ta encontrando seu bean , por padrão o nome do bean é o mesmo da classe, mas é bom colocar o nome la

Verifica se você importou certo a anotação @ManagedBean tem que ser a do pacote javax.faces.bean e não a do javax.annotation

Cria um método init com anotação @PostConstruct e instancia seu Carro nesse método;

Rodrigo_Sasaki

Poste seus arquivos de configuração. web.xml e o faces-config.xml

Eu sei que o ManagedBean deveria ter um construtor implícito, mas experimente declarar um construtor vazio pra ele, só para fins de teste.

R

lucasmadeira, obrigado pela resposta.
Eu verifiquei que o meu @ManagedBean esta utilizando do pacote javax.faces.bean, criei o um método construtor chamando o método init() que tem a anotação: @PostConstruct mas ainda continuo com o erro

segue o codigo do meu novo bean

@ManagedBean(name="carroBean")
@RequestScoped
public class CarroBean {
	
	private Carro carro = new Carro();
	
	public CarroBean() {
		init();
	}
	
	@PostConstruct
	public void init(){
		this.carro = new Carro();
	}
	
	public void adicionaCarro() {
		EntityManager manager = this.getEntityManager();
		CarroRepository repository = new CarroRepository(manager);
		
		repository.adiciona(carro);
		this.carro = new Carro();
	}
	
	public List<Carro> getCarros() {
		EntityManager manager = this.getEntityManager();
		CarroRepository repository = new CarroRepository(manager);
		return repository.buscaTodos();
	}
	
	private EntityManager getEntityManager(){
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		EntityManager manager = (EntityManager) request.getAttribute("EntityManager");
		
		return manager;
	}

	public Carro getCarro() {
		return carro;
	}

	public void setCarro(Carro carro) {
		this.carro = carro;
	}

digaoneves, os meus arquivos web.xml e faces-config.xml são os seguinte:
Ja tentei mapear os meus managedbeans pelo faces-config mais continua o erro.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>integracao-jsf-jpa</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
</web-app>

e faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

</faces-config>
Criado 12 de maio de 2012
Ultima resposta 12 de mai. de 2012
Respostas 5
Participantes 3