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

1 resposta
R

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

1 Resposta

R

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

Criado 11 de junho de 2008
Ultima resposta 11 de jun. de 2008
Respostas 1
Participantes 1