Injeção de Dependência com Spring 3.0 em um ManagedBean utilizando MyFaces

3 respostas
T

Amigos,

Estou tentando fazer um teste simples com Injeção de Dependência. Estou utilizando em meu projeto: MyFaces e Spring 3.0
Criei uma página básica chamada inicio.xhtml onde tento exibir a data e a hora recuperada de um ManagedBean que sofreu injeção de dependência do Spring 3.0
O problema é que o Spring não está efetuando a injeção de dependência gerando o erro abaixo.

Desde já agradeço qualquer ajuda.

javax.naming.NameNotFoundException: Name br.com.tassio.baseweb.basico.mb.InicioMB is not bound in this Context
	org.apache.naming.NamingContext.lookup(NamingContext.java:774)
	org.apache.naming.NamingContext.lookup(NamingContext.java:157)
	org.apache.myfaces.config.annotation.Tomcat7AnnotationLifecycleProvider.newInstance(Tomcat7AnnotationLifecycleProvider.java:68)
	org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:162)
	org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.createManagedBean(ManagedBeanResolver.java:303)
	org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:266)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
	org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:142)
	org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:65)
	org.apache.myfaces.el.convert.VariableResolverToELResolver.getValue(VariableResolverToELResolver.java:96)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
	org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:142)
	org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:70)
	org.apache.el.parser.AstValue.getValue(AstValue.java:146)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:192)
	org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:85)
	javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:243)
	javax.faces.component.UIOutput.getValue(UIOutput.java:71)
	org.apache.myfaces.shared_impl.renderkit.RendererUtils.getValue(RendererUtils.java:343)
	org.apache.myfaces.shared_impl.renderkit.RendererUtils.getStringValue(RendererUtils.java:295)
	org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.renderOutput(HtmlTextRendererBase.java:92)
	org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:79)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:519)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:618)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:614)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:614)
	org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1159)
	org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:263)
	org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)
	org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)

[size=22]Abaixo estão os arquivos envolvidos[/size]

[size=18]inicio.xhtml[/size]

<ui:composition template="/template/basico/template.xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
	<ui:define name="conteudo">

		Data e Hora: <h:outputText value="#{mbInicio.dataHora}" />
	
    </ui:define>
</ui:composition>

[size=18]applicationContext.xml[/size]

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

	<!--  
		Localizar os beans anotados com @Service, @Repository e @Controller
	-->	
	<context:component-scan base-package="br.com.tassio" />

	<tx:annotation-driven />

	<!-- Habilitar a configuração dos Beans por Annotations -->
	<context:annotation-config />

</beans>

[size=18]web.xml[/size]

<?xml version='1.0' encoding='UTF-8'?>
<web-app>

	<display-name>BaseWeb</display-name>
	<description>BaseWeb.</description>

	<welcome-file-list>
		<welcome-file>/inicio.html</welcome-file>
	</welcome-file-list>

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

	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>server</param-value>
	</context-param>

	<!-- Faces Servlet -->
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Faces Servlet Mapping -->
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>

</web-app>

[size=18]InicioMB.class[/size]

package br.com.tassio.baseweb.basico.mb;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.tassio.baseweb.basico.recurso.DataHoraRecurso;


@Controller("cInicio")
@Scope("request")
@ManagedBean(name="mbInicio")
public class InicioMB {

	@Resource
	private DataHoraRecurso recursoDataHora;
	
	public void setRecursoDataHora(DataHoraRecurso recursoDataHora) {
		this.recursoDataHora = recursoDataHora;
	}
	
	public String getDataHora() {
		return recursoDataHora.getDataHora();
	}	
	
}

[size=18]DataHoraRecurso.class[/size]

package br.com.tassio.baseweb.basico.recurso;

import java.util.Calendar;
import org.springframework.stereotype.Service;
import br.com.tassio.baseweb.util.formato.FormatoData;

@Service(value="recursoDataHora")
public class DataHoraRecurso {
	
	private String dataHora;
	
	public DataHoraRecurso() {
		Calendar dateTime = Calendar.getInstance();
		dataHora = FormatoData.dateToStringDdmmaaaaHhmmss(dateTime.getTime());
	}

	public String getDataHora() {
		return dataHora;
	}

}

3 Respostas

D

Muda esta linha no applicationContext:

&lt;context:component-scan base-package="br.com.tassio.*" /&gt;
L

Para integrar o JSF com Spring vc deve alterar o faces-config para delegar ao Spring a resolução das variáveis.

Abaixo segue trecho do faces-config com essa configuração.

<?xml version="1.0" encoding="UTF-8"?> <faces-config ....> ... <application> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> </application> ... </faces-config>

T

Daniel.F, muito obrigado por sua ajuda mas de fato o problema era a ausência das linhas abaixo no faces-config.xml

<application>  
   <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>  
</application>

lsjunior, obrigado, foi muito útil sua ajuda.

Eu caí em outra dúvida. Agora a anotação @ManagedBean(name="mbInicio") parou de funcionar e eu não consigo referenciar a EL #{mbInicio.xxx}. Entendo que isso ocorreu porque eu deleguei ao Spring a interpretação das EL. Há alguma forma de manter as duas coisas funcionando? Alterei a classe InicioMB.java como abaixo mas não adiantou:

[size=18]InicioMB.java[/size]

package br.com.tassio.baseweb.basico.mb;

import java.util.Calendar;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import br.com.tassio.baseweb.basico.recurso.DataHoraRecurso;


@Controller("cInicio")
@Scope("request")
@ManagedBean(name="mbInicio")
@RequestScoped
public class InicioMB {

	public String getTeste() {
		return "isso eh um teste: "+Calendar.getInstance();
	}

	@Resource
	private DataHoraRecurso recursoDataHora;

	public void setRecursoDataHora(DataHoraRecurso recursoDataHora) {
		this.recursoDataHora = recursoDataHora;
	}
	
	public String getDataHora() {
		return recursoDataHora.getDataHora();
	}
	
}
Criado 17 de outubro de 2010
Ultima resposta 18 de out. de 2010
Respostas 3
Participantes 3