Boa tarde,
ao executar um método no managed bean que usa um facade que deveria
ser injetado pelo Spring, percebi que o mesmo está nulo, e gera um
NullPointerException. Pelo debug, percebi que todos os objetos que
deveriam ser injetados também estão nulos.
Fiquei um tempo sem criar aplicações JSF e acho que estou esquecendo
de fazer alguma configuração. Peço ajuda aos colegas para me ajudar a
descobrir o que está faltando.
Seguem os trechos de código e de configuração:
* web.xml
<web-app xmlns="
http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- arquivo do log -->
<context-param>
<param-name>fileLog</param-name>
<param-value>C:/Temp/registrosLocalidade.log</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
<description>
State saving method: "client" or "server" (= default)
See JSF Specification 2.5.2
</description>
</context-param>
<context-param>
<param-name>org.ajax4jsf.SKIN</param-name>
<param-value>classic</param-value>
</context-param>
<!-- Facelets -->
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
<description>Special Debug Output for Development</description>
</context-param>
<!-- para evitar mensagens de erro em comentarios colocados em
paginas XHTML -->
<context-param>
<param-name>facelets.SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
<description>Por usar o Facelets, este parametro informa para a
implementacao do JSF que os arquivos agora terao a extensao
xhtml, e nao mais jsp</description>
</context-param>
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
<!-- Extensions Filter -->
<filter>
<display-name>Ajax4jsf Filter</display-name>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<!-- mapeamento de filtros -->
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<!-- listeners -->
<listener>
<listener-
class>org.springframework.web.context.ContextLoaderListener</listener-
class>
</listener>
<!-- Servlets -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- mapeamento de servlets -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<!-- outros -->
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<application>
<message-bundle>messages</message-bundle>
</application>
<!-- seguranca -->
<security-constraint>
<display-name>Restrict XHTML Documents</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Somente desenvolvedores terao acesso aos arquivos
XHTML</description>
<role-name>developer</role-name>
</auth-constraint>
</security-constraint>
</web-app>
======================================
* faces-config
<faces-config>
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>
<managed-bean>
<managed-bean-name>localidadeMB</managed-bean-name>
<managed-bean-
class>br.gov.ibge.localidade.managedBean.LocalidadeMB</managed-bean-
class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>iniciar</from-outcome>
<to-view-id>/inicio.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/inicio.xhtml</from-view-id>
<navigation-case>
<from-outcome>inserirLocalidade</from-outcome>
<to-view-id>/inserirLocalidade.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
=========================================
* 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/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>sun.jdbc.odbc.JdbcOdbcDriver</value>
</property>
<property name="url">
<value>jdbc:firebirdsql://localhost:3050/C:/tabelas/
sddiLocalidade.fdb</value>
</property>
<property name="username">
<value>SDDILOCALIDADE</value>
</property>
<property name="password">
<value>sddilocalidade</value>
</property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="dataSource" />
</bean>
<bean id="estadoFacade"
class="br.gov.ibge.localidade.facade.EstadoFacadeImpl">
<property name="estadoDao" ref="estadoDao" />
</bean>
<bean id="localidadeFacade"
class="br.gov.ibge.localidade.facade.LocalidadeFacadeImpl">
<property name="localidadeDao" ref="localidadeDao" />
</bean>
<bean id="municipioFacade"
class="br.gov.ibge.localidade.facade.MunicipioFacadeImpl">
<property name="municipioDao" ref="municipioDao" />
</bean>
<bean id="estadoDao"
class="br.gov.ibge.localidade.dao.EstadoDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<bean id="localidadeDao"
class="br.gov.ibge.localidade.dao.LocalidadeDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<bean id="municipioDao"
class="br.gov.ibge.localidade.dao.MunicipioDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
</beans>
===================================
* inserirLocalidade.xhtml
<html xmlns="
http://www.w3.org/1999/xhtml"
xmlns:f="
http://java.sun.com/jsf/core"
xmlns:h="
http://java.sun.com/jsf/html"
xmlns:ui="
http://java.sun.com/jsf/facelets"
xmlns:a4j="
http://richfaces.org/a4j"
xmlns:rich="
http://richfaces.org/rich">
<f:view>
<ui:composition template="/WEB-INF/templates/default.xhtml">
<ui:define name="tituloPag">Intranet UE-GO - Controle de
Localidades</ui:define>
<ui:define name="camadaCentral">
<a4j:form id="formMenu" focus="uf">
<ui:include src="menu.xhtml" />
<f:verbatim><br/></f:verbatim>
<h:panelGrid columns="3">
<f:facet name="header">
<h:outputText value="Informe os dados da nova localidade:"
styleClass="tituloFormulario"/>
</f:facet>
<h:outputText value="UF:" styleClass="labelFormulario"/>
<h:selectOneMenu id="estado"
valueChangeListener="#{localidadeMB.selecionarEstado}"
styleClass="listbox"
validator="#{localidadeMB.validarEstado}">
<f:selectItems value="#{localidadeMB.estados}"/>
<a4j:support event="onchange" reRender="municipio"
focus="municipio"/>
</h:selectOneMenu>
<h:message for="estado" styleClass="mensagemErro"/>
(...)
</h:panelGrid>
</a4j:form>
</ui:define>
</ui:composition>
</f:view>
</html>
====================================
* localidadeMB
private EstadoFacade estadoFacade;
(...)
public List<SelectItem> getEstados(){
List<SelectItem> itens = new ArrayList<SelectItem>();
try{
itens.add(new SelectItem("-- selecione a UF --"));
****** ONDE OCORRE O ERRO, pois estadoFacade == null ******
for(Estado e : estadoFacade.getEstados()){
itens.add(new SelectItem(e.getNome()));
}
return itens;
} catch (PropertiesFileException e) {
}
}
(...)
public void setEstadoFacade(EstadoFacade facade){
this.estadoFacade = facade;
}
public void selecionarEstado(ValueChangeEvent evento){
List<SelectItem> municipiosPorEstado = new ArrayList<SelectItem()>;
***** municipioFacade também está nulo ******
for(String texto :
municipioFacade.getNomesMunicipios(evento.getNewValue().toString())){
if(evento.getNewValue().toString().equals(texto)){
municipiosPorEstado.add(new SelectItem(texto));
}
}
}