Javax.el.PropertyNotFoundException: /restrito/teste.xhtml @52,134 value="#{testeBean[RESOLVIDO]

Boa noite pessoal.

Estou com problemas em um cadastro que estou tentando montar. A minha minha base de dados tenho uma tabela chamada teste e ela tem uma FK para uma tabela chamada produto e outra FK para uma tabela chamada casouso.

No formulário xhtml tenho um campo combo que vai exibir o nome do produto e outro combo para o título do caso de uso. Mesma lógica. O caso é que só o campo do produto é preenchido. Está dando erro por causa do caso de uso e não entendo porque.

O erro é o seguinte:

javax.el.PropertyNotFoundException: /restrito/teste.xhtml @52,134 value="#{testeBean.teste.casouso}": The class 'gestao.teste.Teste' does not have the property 'casouso'.

No xhtml criei os combos assim:

<h:outputLabel value="Caso de Uso:" for="casouso" />
  <h:selectOneMenu id="casouso" value="#{testeBean.teste.casouso}" converter="casousoConverter" rendered="#{!empty contextoBean}">
  <f:selectItems value="#{casousoBean.lista}" var="casouso" itemValue="#{casouso}" itemLabel="#{casouso.titulo}" />
</h:selectOneMenu>

<h:outputLabel value="Produto:" for="produto" />
  <h:selectOneMenu id="produto" value="#{testeBean.teste.produto}" converter="produtoConverter" rendered="#{!empty contextoBean}">
  <f:selectItems value="#{produtoBean.lista}" var="produto" itemValue="#{produto}" itemLabel="#{produto.nome}" />
</h:selectOneMenu> 

E na clase Teste eu crio esse campo caso de uso assim:

@ManyToOne(targetEntity = CasoUso.class, fetch = FetchType.EAGER)
@JoinColumn(name = "casouso", nullable = true)
@ForeignKey(name = "fk_teste_casouso")
@Cascade({org.hibernate.annotations.CascadeType.MERGE, org.hibernate.annotations.CascadeType.SAVE_UPDATE})
private CasoUso casouso;

E no construtor faço assim:

public Teste() {
    this.casouso = new CasoUso();
    this.produto = new Produto();     
}

Alguém tem idéia do que fiz errado?

Olá cristiano!

Tem como postar o código da classe CasoUso e da classe Produto?

Já verificou se CasoUso contem o atributo Teste teste recebendo o @OneToMany?

Até +!

Bom dia.

Na classe CasoUso não criei o atributo Teste teste recebendo o @OnToMany, o que tenho é um atributo CasoUso casouso recebendo o @ManyToOne na classe Teste.

Seguem as classes:

package gestao.casouso;

import java.io.Serializable;

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

@Entity
public class CasoUso implements Serializable {
    private static final long serialVersionUID = 5970319999919464192L;

	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "codigo", nullable = false, length = 10)
    private Integer codigo;
	
	@Column(name = "titulo", length = 50)
    private String titulo;

	@Column(name = "descricao", length = 2000)
    private String descricao;

	/**
	 * @return the codigo
	 */
	public Integer getCodigo() {
		return codigo;
	}

	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	/**
	 * @return the titulo
	 */
	public String getTitulo() {
		return titulo;
	}

	/**
	 * @param titulo the titulo to set
	 */
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	/**
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}

	/**
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CasoUso other = (CasoUso) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (titulo == null) {
			if (other.titulo != null)
				return false;
		} else if (!titulo.equals(other.titulo))
			return false;
		return true;
	}    
}
package gestao.produto;

import gestao.setor.Setor;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

@Entity
public class Produto implements Serializable {

	private static final long serialVersionUID = 8065940517148727330L;

	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "codigo", nullable = false, length = 10)
    private Integer codigo;
	
	@Column(name = "nome", length = 50)
    private String nome;
	
    @ManyToOne(targetEntity = Setor.class, fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
    @JoinColumn(name = "setor", nullable = true)
    @ForeignKey(name = "fk_produto_setor")
    @Cascade({org.hibernate.annotations.CascadeType.MERGE, org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    private Setor setor;
    
    public Produto() {
    	this.setor = new Setor();
    }
    
	/**
	 * @return the codigo
	 */
	public Integer getCodigo() {
		return codigo;
	}
	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	/**
	 * @return the setor
	 */
	public Setor getSetor() {
		return setor;
	}
	/**
	 * @param setor the setor to set
	 */
	public void setSetor(Setor setor) {
		this.setor = setor;
	}
	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result + ((setor == null) ? 0 : setor.hashCode());
		return result;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Produto other = (Produto) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (setor == null) {
			if (other.setor != null)
				return false;
		} else if (!setor.equals(other.setor))
			return false;
		return true;
	}        
}
package gestao.teste;

import gestao.casouso.CasoUso;
import gestao.produto.Produto;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

@Entity
public class Teste implements Serializable {
	
    private static final long serialVersionUID = 685767444108967856L;

	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "codigo", nullable = false, length = 10)
    private Integer codigo;

	@Column(name = "titulo", length = 100)
    private String titulo;

	@Column(name = "descricao", length = 2000)
    private String descricao;

	@Column(name = "prioridade", length = 5)
    private String prioridade;

	@Column(name = "resultado", length = 9)
    private String resultado;

    @Column(name = "status", length = 9)
    private String status;

    @ManyToOne(targetEntity = Produto.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "produto", nullable = true)
    @ForeignKey(name = "fk_teste_produto")
    @Cascade({org.hibernate.annotations.CascadeType.MERGE, org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    private Produto produto;

    @ManyToOne(targetEntity = CasoUso.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "casouso", nullable = true)
    @ForeignKey(name = "fk_teste_casouso")
    @Cascade({org.hibernate.annotations.CascadeType.MERGE, org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    private CasoUso casouso;
    
    public Teste() {
    	this.casouso = new CasoUso();
    	this.produto = new Produto();    	
    }

	/**
	 * @return the codigo
	 */
	public Integer getCodigo() {
		return codigo;
	}

	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	/**
	 * @return the titulo
	 */
	public String getTitulo() {
		return titulo;
	}

	/**
	 * @param titulo the titulo to set
	 */
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	/**
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}

	/**
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	/**
	 * @return the prioridade
	 */
	public String getPrioridade() {
		return prioridade;
	}

	/**
	 * @param prioridade the prioridade to set
	 */
	public void setPrioridade(String prioridade) {
		this.prioridade = prioridade;
	}

	/**
	 * @return the resultado
	 */
	public String getResultado() {
		return resultado;
	}

	/**
	 * @param resultado the resultado to set
	 */
	public void setResultado(String resultado) {
		this.resultado = resultado;
	}

	/**
	 * @return the status
	 */
	public String getStatus() {
		return status;
	}

	/**
	 * @param status the status to set
	 */
	public void setStatus(String status) {
		this.status = status;
	}

	/**
	 * @return the produto
	 */
	public Produto getProduto() {
		return produto;
	}

	/**
	 * @param produto the produto to set
	 */
	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	/**
	 * @return the casouso
	 */
	public CasoUso getCasoUso() {
		return casouso;
	}

	/**
	 * @param casouso the casouso to set
	 */
	public void setCasoUso(CasoUso casouso) {
		this.casouso = casouso;
	}

	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((casouso == null) ? 0 : casouso.hashCode());
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result
				+ ((prioridade == null) ? 0 : prioridade.hashCode());
		result = prime * result + ((produto == null) ? 0 : produto.hashCode());
		result = prime * result
				+ ((resultado == null) ? 0 : resultado.hashCode());
		result = prime * result + ((status == null) ? 0 : status.hashCode());
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Teste other = (Teste) obj;
		if (casouso == null) {
			if (other.casouso != null)
				return false;
		} else if (!casouso.equals(other.casouso))
			return false;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (prioridade == null) {
			if (other.prioridade != null)
				return false;
		} else if (!prioridade.equals(other.prioridade))
			return false;
		if (produto == null) {
			if (other.produto != null)
				return false;
		} else if (!produto.equals(other.produto))
			return false;
		if (resultado == null) {
			if (other.resultado != null)
				return false;
		} else if (!resultado.equals(other.resultado))
			return false;
		if (status == null) {
			if (other.status != null)
				return false;
		} else if (!status.equals(other.status))
			return false;
		if (titulo == null) {
			if (other.titulo != null)
				return false;
		} else if (!titulo.equals(other.titulo))
			return false;
		return true;
	}    
}

Olá!

Tentou fazer o mapeamento do @OneToMany na classe CasoUso, criando um atributo teste?

Outro detalhe que percebi foi que a Classe teste está mapeada como @Entity, mas no xhtml vc a usa como bean? Não sei se o hibernate consegue mapear um ManagedBean…

Até +!

Opa…

Obrigado pelas dicas.
Fiz uns ajustes e agora está funcionando.

Abraço.

Blz! :slight_smile:

Se der, coloca a solução aqui no fórum.

Não esqueça de editar o primeiro post e colocar [RESOLVIDO] no assunto.

Até +!

Na realidade o que me quebrou as pernas foi um problema de case sensitive.
Onde eu chamava o bean #{casouso} tive de substituir por #{casoUso}.