Pessoal, estou tentando fazer um projeto com JSF + Hibernate + Jboss, mas está dando erro ao iniciar o projeto. Estou seguindo explicações do livro “Programação Java para a Web”. Como sugestão do livro estou implementando a técnica Open Session in View, e pra isso estou utilizando uma classe Filter, mas por algum motivo que eu desconheço não está dando certo. O log dá o seguinte erro (não estou postando o log inteiro, apenas a parte do erro. Se for preciso eu posto o resto):
21:04:22,668 INFO [stdout] (MSC service thread 1-4) Criação inicial do objeto SessionFactory falhou. Erro: org.jboss.msc.service.CircularDependencyException: Service jboss-as has a circular dependency
21:04:22,669 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/Financeiro]] (MSC service thread 1-4) Exception starting filter conexaoFilter: java.lang.ExceptionInInitializerError
at financeiro.conexao.HibernateUtil.buildSessionFactory(HibernateUtil.java:17) [classes:]
at financeiro.conexao.HibernateUtil.<clinit>(HibernateUtil.java:8) [classes:]
at financeiro.filter.ConexaoHibernateFilter.init(ConexaoHibernateFilter.java:40) [classes:]
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:447) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3269) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3865) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_09]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_09]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_09]
Caused by: org.jboss.msc.service.CircularDependencyException: Service jboss-as has a circular dependency
at org.jboss.msc.service.ServiceContainerImpl.detectCircularity(ServiceContainerImpl.java:617)
at org.jboss.msc.service.ServiceContainerImpl.detectCircularity(ServiceContainerImpl.java:588)
at org.jboss.msc.service.ServiceContainerImpl.install(ServiceContainerImpl.java:562)
at org.jboss.msc.service.ServiceTargetImpl.install(ServiceTargetImpl.java:201)
at org.jboss.msc.service.ServiceControllerImpl$ChildServiceTarget.install(ServiceControllerImpl.java:2228)
at org.jboss.msc.service.ServiceTargetImpl.install(ServiceTargetImpl.java:201)
at org.jboss.msc.service.ServiceControllerImpl$ChildServiceTarget.install(ServiceControllerImpl.java:2228)
at org.jboss.msc.service.ServiceBuilderImpl.install(ServiceBuilderImpl.java:307)
at org.jboss.as.naming.WritableServiceBasedNamingStore.bind(WritableServiceBasedNamingStore.java:70)
at org.jboss.as.naming.WritableServiceBasedNamingStore.rebind(WritableServiceBasedNamingStore.java:90)
at org.jboss.as.naming.NamingContext.rebind(NamingContext.java:237)
at org.jboss.as.naming.InitialContext.rebind(InitialContext.java:178)
at javax.naming.InitialContext.rebind(InitialContext.java:431) [rt.jar:1.7.0_09]
at org.hibernate.util.NamingHelper.bind(NamingHelper.java:97) [hibernate3.jar:3.6.10.Final]
at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:113) [hibernate3.jar:3.6.10.Final]
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:367) [hibernate3.jar:3.6.10.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) [hibernate3.jar:3.6.10.Final]
at financeiro.conexao.HibernateUtil.buildSessionFactory(HibernateUtil.java:14) [classes:]
... 11 more
21:04:22,682 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-4) Error filterStart
21:04:22,682 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-4) Context [/Financeiro] startup failed due to previous errors
21:04:22,690 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.web.deployment.default-host./Financeiro: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./Financeiro: JBAS018040: Failed to start context
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:95)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_09]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_09]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_09]
O erro diz que há uma dependência circular, mas eu não sei exatamente o que é isso. O meu mapeamento parece estar certo.
Classe Filter:
...
public class ConexaoHibernateFilter implements Filter {
private SessionFactory sessionFactory;
@Override
public void destroy() { }
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
this.sessionFactory.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
this.sessionFactory.getCurrentSession().getTransaction().commit();
this.sessionFactory.getCurrentSession().close();
} catch (Throwable e) {
try {
if (this.sessionFactory.getCurrentSession().getTransaction().isActive()) {
this.sessionFactory.getCurrentSession().getTransaction().rollback();
}
} catch (Throwable t) {
t.printStackTrace();
}
throw new ServletException(e);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
this.sessionFactory = HibernateUtil.getSessionFactory();
}
}
HibernateUtil:
...
public class HibernateUtil {
private static final SessionFactory SESSION_FACTORY = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
return cfg.buildSessionFactory();
} catch (Throwable e) {
System.out.println("Criação inicial do objeto SessionFactory falhou. Erro: " + e);
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return SESSION_FACTORY;
}
}
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>Financeiro</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>*.jsf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<filter>
<filter-name>conexaoFilter</filter-name>
<filter-class>financeiro.filter.ConexaoHibernateFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>conexaoFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
</web-app>
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">senha</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/banco</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.generate_statistics">true</property>
<property name="hibernate.use_sql_comments">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="financeiro.dto.Pessoa"/>
<mapping class="financeiro.dto.Banco"/>
<mapping class="financeiro.dto.Periodo"/>
<mapping class="financeiro.dto.Movimentacao"/>
<mapping class="financeiro.dto.Receita"/>
<mapping class="financeiro.dto.Gasto"/>
</session-factory>
</hibernate-configuration>