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>