Opa galera…
Seguinte, na minha aplicação nova eu estou desenvolvendo utilizando JSF, Spring e DWR…
O Spring é responsavel somente por criar meu SessionFactory do Hibernate e também instanciar o meu DAO genérico. Este dao vai ser passado para os beans JSF.
O JSF por sua vez é responsavel por renderizar as páginas e receber chamadas remotas do DWR. (Eu ja usei DWR & JSF antes e nunca tive problemas… sempre funcionou muito bem)
Bom, o que acontece é que quando eu chamo o método do meu bean JSF pelo DWR, eu recebo a seguinte exception.
Method execution failed:
java.lang.IllegalArgumentException: 'name' must not be null
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.beans.factory.BeanFactoryUtils.transformedBeanName(BeanFactoryUtils.java:71)
at org.springframework.beans.factory.support.AbstractBeanFactory.transformedBeanName(AbstractBeanFactory.java:859)
at org.springframework.beans.factory.support.AbstractBeanFactory.containsBean(AbstractBeanFactory.java:328)
at org.springframework.context.support.AbstractApplicationContext.containsBean(AbstractApplicationContext.java:893)
at org.springframework.web.jsf.DelegatingVariableResolver.resolveSpringBean(DelegatingVariableResolver.java:138)
at org.springframework.web.jsf.SpringBeanVariableResolver.resolveVariable(SpringBeanVariableResolver.java:42)
at org.directwebremoting.faces.JsfCreator.getInstance(JsfCreator.java:84)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:348)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.directwebremoting.faces.FacesExtensionFilter.doFilter(FacesExtensionFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
--Erroring: batchId[0] message[java.lang.IllegalArgumentException: 'name' must not be null]
Meus códigos estão da seguinte maneira:
Meu web.xml:
<!-- ******************* -->
<!-- Configuração do JSF -->
<!-- ******************* -->
<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>/faces/*</url-pattern>
</servlet-mapping>
<!-- ******************* -->
<!-- Configuração do DWR -->
<!-- ******************* -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>facesExtensionFilter</filter-name>
<filter-class>org.directwebremoting.faces.FacesExtensionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>facesExtensionFilter</filter-name>
<url-pattern>/dwr/*</url-pattern>
</filter-mapping>
<!-- ********************** -->
<!-- Configuração do Spring -->
<!-- ********************** -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
meu arquivo faces-config
<faces-config>
<!-- Spring Integration -->
<application>
<variable-resolver>org.springframework.web.jsf.SpringBeanVariableResolver</variable-resolver>
</application>
<managed-bean>
<managed-bean-name>clienteBean</managed-bean-name>
<managed-bean-class>br.com.ethigroup.pvtec.beans.BeanCliente</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>dao</property-name>
<value>#{genericDAO}</value>
</managed-property>
</managed-bean>
</faces-config>
meu arquivo applicationContext:
<!-- ::::::::::::::::::::::::: -->
<!-- CONFIGURAÇÃO DO HIBERNATE -->
<!-- ::::::::::::::::::::::::: -->
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5433/pvtec" />
<property name="username" value="dbapvtec" />
<property name="password" value="dbmaster" />
</bean>
<bean id="myHibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.c3p0.minPoolSize">5</prop>
<prop key="hibernate.c3p0.maxPoolSize">20</prop>
<prop key="hibernate.c3p0.timeout">600</prop>
<prop key="hibernate.c3p0.max_statement">50</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
</props>
</property>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="hibernateProperties" ref="myHibernateProperties" />
<property name="mappingResources">
<list>
<value>../hibernate/pvtec/Cliente.hbm.xml</value>
<value>../hibernate/pvtec/ClienteFonetica.hbm.xml</value>
</list>
</property>
</bean>
<bean id="genericDAO" name="genericDAO" class="br.com.ethigroup.util.hibernate.EthiGenericDAO">
<property name="factory" ref="mySessionFactory"></property>
</bean>
meu arquivo dwr
<dwr>
<init>
<creator id="jsf" class="org.directwebremoting.faces.JsfCreator" />
</init>
<allow>
<create creator="jsf" javascript="clienteJsfBean" scope="request" >
<param name="class" value="br.com.ethigroup.pvtec.beans.BeanCliente" />
<param name="beanName" value="clienteBean"/>
<include method="save" />
<include method="update" />
<include method="delete" />
<include method="get" />
</create>
<!-- Conversores de modelos -->
<convert converter="bean" match="br.com.ethigroup.pvtec.models.Cliente" />
<create javascript="Cliente" creator="new">
<param name="class" value="br.com.ethigroup.pvtec.models.Cliente"></param>
</create>
<!-- Conversor para comunicação -->
<convert converter="bean" match="br.com.ethigroup.util.comunication.EthiResponse" />
</allow>
</dwr>
Código usado para invocar o método, nada d+ (estou passando null apenas como teste…)
clienteJsfBean.save( null, btSalvar_actionUpdateCallback );
Minha classe que recebe a chamada, eu retirei os SET e GETS…
public class BeanCliente {
public static Logger logger = Logger.getLogger( BeanCliente.class );
/* Atributos usados para bind JSF */
private Integer codigo, numEndereco;
private String nome, razao, cnpj, endereco, cidade, uf, bairro, cep, complemento;
private Date datCadastro;
/* DAO genérico */
private EthiGenericDAO dao;
/* Métodos de negócio */
public EthiResponse save( Cliente pCliente ){
EthiResponse response = new EthiResponse();
System.out.println( "SAVE" );
return response;
}
}
Bom pelo que eu entendi da exception, tudo ocorre bem até a chamada de:org.directwebremoting.faces.JsfCreator.getInstance(JsfCreator.java:84)
Mas depois o processamento é passado para o spring, depois disto eu não entendi mais. Não entendi pelo seguinte, ali ele tenta criar um BEAN, teoricamente o bean de DAO genérico que deve ser usado pelo bean do JSF. Porém, mesmo se eu retiro o <managed-property> da definição do meu bean JSF, o erro continua acontecendo. Então não estou entendendo do porque uma requisição DWR para o JSF, está sendo tratada pelo Spring… E qual bean afinal ele está tentando criar ?
Alguem ja passou por isto antes ?
Se alguem tiver alguma resposta, ou sei la, somente uma idéia do que seja… da um toq ae por favor.
Obrigado
Rodrigo Kerkhoff