Erro Target Unreachable, returned null

Olá

Depois de ler alguns livros, tutorias e algumas video aulas. Fiz um mix de tudo que peguei de conhecimento e em alguns pontos fiz a minha maneira (não sei se é o certo, mas o projeto é pequeno e simples) decidi não começar com nada muito complexo, o projeto é apenas para ver meu nível de absorção do conteúdo.

É uma app em JSF + Hibernate.

Estou enfrentando esse erro:

javax.el.PropertyNotFoundException: /index.xhtml @12,83 value="#{especialidadeBean.especialidade.especialidade}": Target Unreachable, 'especialidade' returned null
	at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
	at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
	at javax.faces.component.UIInput.validate(UIInput.java:960)
	at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
	at javax.faces.component.UIInput.processValidators(UIInput.java:698)
	at javax.faces.component.UIForm.processValidators(UIForm.java:253)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
	at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.com.cuc.util.HibernateFilter.doFilter(HibernateFilter.java:25)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

A model

@Entity
@Table(name = "especialidade")
public class Especialidade implements Serializable {
	
	private static final long serialVersionUID = -5375278968719338222L;

	@Id
	@GeneratedValue
	@Column(name = "id_especialidade")
	private Integer especialidade;
	
	private String descricao;

	
	public Integer getEspecialidade() {
		return especialidade;
	}

	public void setEspecialidade(Integer especialidade) {
		this.especialidade = especialidade;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result
				+ ((especialidade == null) ? 0 : especialidade.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Especialidade other = (Especialidade) obj;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (especialidade == null) {
			if (other.especialidade != null)
				return false;
		} else if (!especialidade.equals(other.especialidade))
			return false;
		return true;
	}
}

A DAO

public class EspecialidadeDAO {

	private Session session;	
	
	public void setSession(Session session) { this.session = session; }
	
	public void salvar(Especialidade especialidade) { this.session.save(especialidade); }
	
	public void atualizar(Especialidade especialidade) {this.session.update(especialidade); }
	
	public void excuir(Especialidade especialidade) {this.session.delete(especialidade); }
	
}

A BEAN

@ManagedBean(name="especialidadeBean")
@RequestScoped
public class EspecialidadeBean {

	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	private Especialidade especialidade;
	private EspecialidadeDAO especialidadeDAO;
		
	public void salvar(Especialidade especialidade) {		
		this.especialidadeDAO = new EspecialidadeDAO();
		this.especialidadeDAO.setSession(session);
		especialidadeDAO.salvar(especialidade);
	}

	public Especialidade getEspecialidade() {
		return especialidade;
	}

	public void setEspecialidade(Especialidade especialidade) {
		this.especialidade = especialidade;
	}	
}

Fiz uma classe filter para controlar abertura/fechamento da conexão

public class HibernateFilter implements Filter {

	private SessionFactory sf;
	

	public void init(FilterConfig config) throws ServletException {
		this.sf = HibernateUtil.getSessionFactory();		
	}
	
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain chain) throws ServletException {
		try {
			this.sf.getCurrentSession().beginTransaction();
			chain.doFilter(servletRequest, servletResponse);
			this.sf.getCurrentSession().getTransaction().commit();
			this.sf.getCurrentSession().close();
		} catch (Throwable ex) {
			try {
				if (this.sf.getCurrentSession().getTransaction().isActive()) {
					this.sf.getCurrentSession().getTransaction().rollback();
				}
			} catch (Throwable e) {
				e.printStackTrace();
			}
		  throw new ServletException(ex);	
		}		
	}
	
	public void destroy() {	}	
}

o Xhtml (coloquei o input para informar o ID manualmente, pois sem colocar na “mão” também dava o mesmo erro, mas não resolveu)

<!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:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body> 
	<h3>Cadastro de Especialidades</h3>
	<h:form>
		<h:outputLabel value="Id:" for="id" />
		<h:inputText id="id" value="#{especialidadeBean.especialidade.especialidade}" />
		<h:outputLabel value="Descrição:" for="descricao" />
		<h:inputText id="descricao" value="#{especialidadeBean.especialidade.descricao}" />
		<h:commandButton value="Salvar" action="#{especialidadeBean.salvar}" />		
	</h:form>	
</body> 
</html>

O web.xml

<?xml version="1.0"?>
<web-app version="2.5" 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-app_2_5.xsd">
 <display-name>CadastroUnico</display-name>
  <context-param>
  <param-name>javax.faces.PROJECT_STAGE</param-name>
  <param-value>Development</param-value>
 </context-param>
 <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>*.jsf</url-pattern>
 </servlet-mapping>
 <filter>
  <filter-name>HibernateFilter</filter-name>
  <filter-class>br.com.cuc.util.HibernateFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>HibernateFilter</filter-name>
  <url-pattern>*.jsf</url-pattern>
 </filter-mapping>
 <welcome-file-list>
 	<welcome-file>index.html</welcome-file>
 </welcome-file-list>
</web-app>

é <h:body>

você está pedindo para o usuario entrar com o id
mas lá na classe vc colocou generatedValue

tira isso
<h:inputText id=“id” value="#{especialidadeBean.especialidade.especialidade}" />

e na classe deixe dessa maneira

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id_especialidade") private Integer especialidade;

[quote=tmvolpato]é &lt;h:body&gt;

você está pedindo para o usuario entrar com o id
mas lá na classe vc colocou generatedValue

tira isso
<h:inputText id=“id” value="#{especialidadeBean.especialidade.especialidade}" />

e na classe deixe dessa maneira

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id_especialidade") private Integer especialidade; [/quote]

tmvolpato obrigado pela resposta, na verdade eu coloquei isso pois sem estava dando erro também…mas descobri que o problema não era isso…era meu managed bean mesmo.
removi isso ai do meu form e deixei o Bean assim

@ManagedBean(name="especialidadeBean")
@RequestScoped
public class EspecialidadeBean {

	private Especialidade especialidade;
	private EspecialidadeDAO especialidadeDAO;
	
			
	public EspecialidadeBean() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		this.especialidade = new Especialidade();
		this.especialidadeDAO = new EspecialidadeDAO();
		this.especialidadeDAO.setSession(session);
	}

	public void salvar() {		
		especialidadeDAO.salvar(especialidade);
	}

	
	public Especialidade getEspecialidade() { return especialidade;	}
	public void setEspecialidade(Especialidade especialidade) {	this.especialidade = especialidade;	}
	
}

faltou isso

private Especialidade especialidade = new Especialidade(); //instância o objeto
o mesmo com o dao

e outra que materia é esse que você está seguindo
usar um session do hibernate na classe bean é começa mal já hein

[quote=tmvolpato]faltou isso

private Especialidade especialidade = new Especialidade(); //instância o objeto
o mesmo com o dao

e outra que materia é esse que você está seguindo
usar um session do hibernate na classe bean é começa mal já hein
[/quote]

rsrsrs também não sei onde arrumei isso…mas já tratei de tirar daí