JSF 2 - Target Unreachable resolved to null

Fala ae pessoal !!

Estou tentando usar MAVEN + JSF + TOMCAT EMBEDED porém o faces não reconhece as minhas classes anotadas com @ManagedBean/@RequestScoped, alias todos os escopos.

Abaixo está o meu pom.xml, o backing bean, web.xml e xhtml.

Me parece ser um problema de EL mas, estou quebrando a cabeça e não consegui a solução. Eu estava usando somente o MOJARRA, tentei com o PRIMEFACES e com ambos os componentes funcionam, o JSF não reconhece nada que vem em #{…}

Quando eu tento acessar uma propriedade por EL como percorrer uma lista, me é apresentado:

javax.el.PropertyNotFoundException: /index.xhtml @11,50 value="#{teste.lista}": Target Unreachable, identifier 'teste' resolved to null
	at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:93)
	at org.primefaces.component.api.UIData.isLazyLoading(UIData.java:170)
	at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:187)
	at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:107)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:874)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1612)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1612)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:271)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:124)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:103)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:311)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)

OBS: Eu criei o faces-config.xml com o XSD do 2.0

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>controle</groupId>
	<artifactId>despesas</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<description>Controle de Despesas</description>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<jsf.version>2.1</jsf.version>
		<servlet.api>3.0-alpha-1</servlet.api>
		<facelets>1.1.14</facelets>
	</properties>

	<repositories>
		<repository>
			<id>prime-repo</id>
			<name>PrimeFaces Maven Repository</name>
			<url>http://repository.primefaces.org</url>
			<layout>default</layout>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>org.glassfish.web</groupId>
			<artifactId>el-impl</artifactId>
			<version>2.2</version>
			<scope>runtime</scope>
			<exclusions>
				<exclusion>
					<groupId>javax.el</groupId>
					<artifactId>el-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet.api}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>com.sun.facelets</groupId>
			<artifactId>jsf-facelets</artifactId>
			<version>${facelets}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.0.0-b13</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.0.0-b13</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.primefaces</groupId>
			<artifactId>primefaces</artifactId>
			<version>3.3.1</version>
			<scope>compile</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.5.1</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.0-beta-1</version>
				<configuration>
					<port>8080</port>
					<path>/{project.artifactId}</path>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
				<version>6.1.18</version>
				<configuration>
					<contextPath>/despesas</contextPath>
					<scanIntervalSeconds>10</scanIntervalSeconds>
					<connectors>
						<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
							<port>8080</port>
							<maxIdleTime>60000</maxIdleTime>
						</connector>
					</connectors>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

ManagedBean

@ManagedBean
@ViewScoped
public class Teste {

	private List<String> lista;

	@PostConstruct
	public void init() {
		lista = new ArrayList<String>();
		lista.add("a");
	}

	public List<String> getLista() {
		return lista;
	}

	public void setLista(List<String> lista) {
		this.lista = lista;
	}
}

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 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-app_3_0.xsd"
	version="3.0">

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
	<context-param>
		<param-name>javax.faces.PROJECT_STAGE</param-name>
		<param-value>Development</param-value>
	</context-param>
	
	<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>*.jsf</url-pattern>
	</servlet-mapping>
</web-app>

xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head>

</h:head>

<h:body>
	<p:dataTable var="lista" value="#{teste.lista}">
		<p:column>
			<p:commandButton actionListener="#{teste.doLogin}" type="button"
				value="Click" />
		</p:column>
		<p:column>
			<h:outputText value="lista" />
		</p:column>
	</p:dataTable>
</h:body>
</html>

Como você não definiu nenhum nome para o teu Managed bean, ele assumiu o padrão que é o nome da classe, nesse caso “Teste”.

@ManagedBean("teste") @ViewScoped public class Teste {

Já tentei com o ‘T’ maiúsculo, mas, os MB trabalham com camel case

No seu web.xml, experimente alterar isso:<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> Por isso:<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> // alterei aqui </servlet-mapping>

Troquei e deu 404…

dá uma olhada nos import, talvez possa ser isso

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

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

eu notei que sua versao do jsf é 2.0 tenta a ultima versao

<groupId>com.sun.faces</groupId>  
            <artifactId>jsf-api</artifactId>  
            <version>2.0.0-b13</version>  
            <scope>compile</scope>  

do mais tá tudo certinho…

Vish, deu o mesmo erro

Como você está acessando sua página?

Qual a URL que você tenta acessar?

http://localhost:8080/projeto

Então ele cai em uma página jsp

response.sendRedirect("index.jsf)

index.jsp e index.xhtml estão no mesmo nível na hierarquia de pastas

envie para uma pagina.xhtml

claro, tendo seu web.xml mapeado para isso

digaoneves o meu web.xml atualmente está assim

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 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-app_3_0.xsd"
	version="3.0">

	<context-param>
		<param-name>javax.faces.PROJECT_STAGE</param-name>
		<param-value>Development</param-value>
	</context-param>
	
	<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>*.xhtml</url-pattern>
	</servlet-mapping>
</web-app>

e no xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head>

</h:head>

<h:body>
	 #{teste == null}
</h:body>
</html>

Onde a asserção acima retorna true, coloquei o MB com o Scope de Application e deixei ele eager=true para ver se conseguia passar pelo construtor dele mas, sem sucesso

Pessoal, obrigado a todos os que me ajudaram…

Eu fiz o deploy em um server Tomcat normal e funcionou, minha solução foi não usar o embeded e perder um pouco na agilidade de build… acho que vou criar uma task ant e copiar o war para a pasta webapp do tomcat

Vlww !!!

melhor usei o plugin cargo do maven