ERRO ao invocar método DWR para bean JSF... (Estou usando JSF juntamente com SPRING)

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

Po galera foi mal, era só mudar uma conf la no DWR.XML…

&lt;create creator="jsf" javascript="clienteJsfBean" scope="request" &gt; &lt;param name="class" value="br.com.ethigroup.pvtec.beans.BeanCliente" /&gt; &lt;param name="managedBeanName" value="clienteBean"/&gt; &lt;include method="save" /&gt; &lt;include method="update" /&gt; &lt;include method="delete" /&gt; &lt;include method="get" /&gt; &lt;/create&gt;

Era só mudar o parametro de beanName para managedBeanName, agora ta funcionando de boa…

Bom… pelo menos o post pode servi pra alguem q queira usar JSF, Spring e DWR juntos hehehe

Vlw ae