Integração nativa do Spring com JSF

  1. Registrei o variable Resolver no faces-config.xml,
    configurei meus beans, no “businessContext” (applicationContext.xml).
   <application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
        <locale-config>
            <default-locale>en</default-locale>
            <supported-locale>en</supported-locale>
            <supported-locale>es</supported-locale>
        </locale-config>
        <message-bundle>messages</message-bundle>
    </application>
  1. Configurei as “properties” no faces-config.xml mesmo, com os beans do Spring
	<managed-bean>
		<managed-bean-name>pc_ManterClientePageForm</managed-bean-name>
		<managed-bean-class>
			br.com.agence.sales.control.ManterClientePageForm
		</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
		<managed-property>
			<property-name>clientService</property-name>
			<value>#{clientService}</value>
		</managed-property>
	 </managed-bean>

O que ocorre é que, na execução, é setado as propriedades no managedBean quando eu entro na página (setClientService),
só que o clientService que vem como argumento é nulo…
Ou seja… não tá buscando do Spring.

Como eu faço funcionar ? Parece que eu segui todos os passos corretamente

a unica diferença pra o que e costumo fazer é que eu configuro também o tipo da propriedade no faces-config.xml

ou então as vezes nem coloco nada no faces-config, coloco todos os beans direto no applicationContext.xml

Define os manageBeans dentro do applicationContext?

nao funciona aqui,
o que ta documentado la é usar esse variableResolver,

não entendo porque vem nulo

tentei até registrar um bean String aqui e nada, olha o código do applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<bean id="text" class="java.lang.String">
		<constructor-arg>
			<value>A Text From Spring</value>
		</constructor-arg>
	</bean>

</beans>

E lá no faces-config, fiz a referência

<managed-bean>
		<managed-bean-name>pc_LoginPageForm</managed-bean-name>
		<managed-bean-class>
			br.com.agence.sgv.control.LoginPageForm
		</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>text</property-name>
			<property-class >java.lang.String</property-class>
			<value>#{text}</value>
		</managed-property>
	</managed-bean>

Na hora de acessar a pagina, o setter e´ chamado e o parametro é nulo !

argh

da uma olhada no meu blog e baixa os exemplos das palestras na SEPAI e do ultimo webmobile :smiley:

tem exemplos disto la …

PS.: tu colocou o listener do spring no web.xml?

[quote=urubatan]da uma olhada no meu blog e baixa os exemplos das palestras na SEPAI e do ultimo webmobile :smiley:

tem exemplos disto la …

PS.: tu colocou o listener do spring no web.xml?[/quote]

claro,

inclusive, pegando explicitamente pelo applicationContext

ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
		this.clientService = (ClientService) ctx.getBean("clientService");

funciona.

Ele deveria injetar quando eu acesso a página ou é só dessa forma que eu consigo obter o objeto?

vamos passo a passo então

o que esta no parametro: contextLocation do web.xml?
onde esta o arquivo applicationContext.xml?
em que arquivo esta definido o bean que tu quer usar a partir do JSF?

uma outra solução, caso tu esteja usando o spring 2.0
é acessar o site do spring-annotation, e pegar os jars dos modulos web e jsf
se for só para fazer esta integração, no que tu colocar estes jars no teu web-inf/lib isto ja deve passar a funcionar :smiley:

No web.xml eu não especifiquei o caminho do contextConfigLocation, o que faz ele ler do web-inf, e ta la o applicationContext - se nao tivesse la nem daria pra pegar o bean explicitamente como eu mostrei no post anterior.

só tenho isso relativo ao spring no web.xml

	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>

qual versáo/implementação do JSF vc esta usando?

Eu to usando o JSF 1.2 (sun),
com o Tomcat 5.5.20,
com o Facelets e seu compilador de JSP pra poder suportar o JSF 1.2 em cima desse tomcat

bom, eu só testei até agora o spring+jsf 1.1 …
pode ser isto, vou tentar arrumar um tempo pra testar spring+jsf 1.2 …

Já tentou utilizar o VariableResolver?

<faces-config> <application> <variable-resolver> org.springframework.web.jsf.SpringBeanVariableResolver </variable-resolver> </application> </faces-config>

T+