Spring com JSF

Olá pessoal, estou tentando montar uma app. com Spring e JSF mas a injeção de dependência não está funcionando, o objeto fica nulo retornando um NullPointerException.

Segue abaixo o que eu fiz… mas resumidamente, eu coloquei um bean como uma propriedade de outro fazendo referência a ele.

package br.com.verano.bi.controller;



import org.springframework.beans.factory.annotation.Autowired;

import br.com.verano.bi.service.TestService;

public class TestController {

	
	private String username;
	private String password;
	
	@Autowired
	private TestService testService;
	
	public String action(){
		return testService.getToView();
	}	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public TestService getTestService() {
		return testService;
	}
	public void setTestService(TestService testService) {
		this.testService = testService;
	}
}
<?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:context="http://www.springframework.org/schema/context"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.0.xsd">


	<bean id="controller"
		class="br.com.verano.bi.controller.TestController" scope="request">
		<property name="testService">
			<ref bean="service" />
		</property>
	</bean>

	<bean id="service" class="br.com.verano.bi.service.TestService"
		scope="request" />
</beans>

Vlw galera.

O uso está errado!

Primeiro você deve configurar o spring no faces-config, depois, injetar a propriedade do MBean também no mesmo arquivo!

Dê uma olhada na documentação
http://static.springsource.org/spring/docs/2.5.x/reference/web-integration.html#jsf-delegatingvariableresolver

thiago.correa, funcionou Ok!! Muito Obrigado!

Inclusive consegui colocar o scanner de annotations!!

Vlw!

Você diz injetar os serviços nos MBeans via annotations?!
Opa, posta aí como você fez?!

basta usar a anotação @Resource

Mas isso na versão 2.5.6 do Spring com JSF 1.2??!

Mas isso na versão 2.5.6 do Spring com JSF 1.2??![/quote]
Sim.
Obviamente,tendo que mapear o bean no applicationContext.xml primeiro.

Comentado está o que não é mais necessário, utilizando o scan

<?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:context="http://www.springframework.org/schema/context"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.0.xsd">



    <context:component-scan base-package="br.com.verano.bi"/>
    <context:annotation-config/>



	<!-- 
	<bean id="controller"
		class="br.com.verano.bi.controller.TestController" scope="request">
		<property name="testService">
			<ref bean="service" />
		</property>
	</bean>

	<bean id="service" class="br.com.verano.bi.service.TestService"
		scope="request" />-->
</beans>

Flw galera!

Mas isso na versão 2.5.6 do Spring com JSF 1.2??![/quote]
Sim.
Obviamente,tendo que mapear o bean no applicationContext.xml primeiro.[/quote]

Sim isso é obvio, mas a única anotação que eu achei como resource foi a javax.annotation.Resource que espera como parâmetro um JNDI.

Outra coisa, o mapeamento dos beans do spring/hibernate usando anotação eu sei que é possível, agora, entre beans do spring e Mbeans do JSF apenas é possível utilizando configuração via XML, segundo a documentação oficial.

Fiz um teste aqui e o ao tentar acessar um bean do spring a partir do MBean rolou uma NPE, segue os códigos

MBean

package br.com.fox.imobiliaria.mbean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import br.com.fox.imobiliaria.entity.State;
import br.com.fox.imobiliaria.service.StateService;

public class StateMBean {

	private State state = new State();

	@Resource
	private StateService stateService;

	public void setStateService(StateService stateService) {
		this.stateService = stateService;
	}

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}

	public String save() {
		stateService.save(state);
		return list();
	}

//demais codigos omitidos

state-faces-config

&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&gt;
	&lt;managed-bean&gt;
		&lt;managed-bean-name&gt;stateMBean&lt;/managed-bean-name&gt;
		&lt;managed-bean-class&gt;br.com.fox.imobiliaria.mbean.StateMBean&lt;/managed-bean-class&gt;
		&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
&lt;!--		&lt;managed-property&gt;--&gt;
&lt;!--			&lt;property-name&gt;stateService&lt;/property-name&gt;--&gt;
&lt;!--			&lt;property-class&gt;br.com.fox.imobiliaria.service.StateService&lt;/property-class&gt;--&gt;
&lt;!--			&lt;value&gt;#{stateService}&lt;/value&gt;--&gt;
&lt;!--		&lt;/managed-property&gt;--&gt;
	&lt;/managed-bean&gt;
&lt;!-- demais códigos omitidos --&gt;

faces-config

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&gt;
 &lt;application&gt;
  &lt;view-handler&gt;com.sun.facelets.FaceletViewHandler&lt;/view-handler&gt;
  &lt;variable-resolver&gt;org.springframework.web.jsf.SpringBeanVariableResolver&lt;/variable-resolver&gt;
  &lt;locale-config&gt;
   &lt;default-locale&gt;pt_BR&lt;/default-locale&gt;
   &lt;supported-locale&gt;pt_BR&lt;/supported-locale&gt;
  &lt;/locale-config&gt;
  &lt;message-bundle&gt;br.com.fox.imobiliaria.resources.Messages_pt_BR&lt;/message-bundle&gt;
 &lt;/application&gt;
&lt;/faces-config&gt;

applicationContext.xml

[code]<?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:context=“http://www.springframework.org/schema/context
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd”>

&lt;context:annotation-config /&gt;
&lt;context:component-scan base-package="br.com.fox.imobiliaria.service.impl" /&gt;
&lt;context:component-scan base-package="br.com.fox.imobiliaria.repository.dao.impl" /&gt;

<!-- demais códigos omitidos -->[/code]

Se for realmente possível mapear beans do spring no MBean do JSF usando anotação, por favor me indique o que eu devo mudar!

Thiago, você colocou o scan a partir do caminho br.com.fox.imobiliaria.service.impl e br.com.fox.imobiliaria.repository.dao.impl mas a sua classe está em br.com.fox.imobiliaria.mbean.

Este scan consegue fazer a injeção a partir dos dois pacotes citados em diante. Eu acredito que ficaria legal vc colocar no scan br.com.fox

Aí ele vai procurar tudo a partir desse pacote.

[quote=ivandasilva]Thiago, você colocou o scan a partir do caminho br.com.fox.imobiliaria.service.impl e br.com.fox.imobiliaria.repository.dao.impl mas a sua classe está em br.com.fox.imobiliaria.mbean.

Este scan consegue fazer a injeção a partir dos dois pacotes citados em diante. Eu acredito que ficaria legal vc colocar no scan br.com.fox

Aí ele vai procurar tudo a partir desse pacote.[/quote]

Daí ele iria procurar em todos os pacotes, sendo que há classes que não são serviços/repositórios ;)!!!
Além do mais, o scan serve para dizer que ele deve escanear nos pacotes que possuem os servicoes (@Repository e @Service)

Me mostra o teu MBean como você fez para injetar o serviço!

Segue em anexo o que eu fiz…

Cara, eu testei o scan com classes anotadas como @Component e funcionou, isto porque @Repository, @Service e @Controller derivam da @Component… mas, aí fica por conta do freguês, cara mais uma vez, valew pela força, eu não estava achando o que faltava para tirar o canalha do NullPointerException!!