Spring 3.0 + JSF 2.0

Bom dia pessoal !

Estou tentando criar um projeto com JSF 2.0 + Spring 3.0, mais não consigo nem startar o tomcat 7.
Segue o erro abaixo

03/08/2011 11:48:10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler [“ajp-bio-8009”]
03/08/2011 11:48:10 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 718 ms
03/08/2011 11:48:10 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
03/08/2011 11:48:10 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
java.lang.IllegalArgumentException: class javax.faces.component.html.HtmlMessage is not assignable to interface org.springframework.web.WebApplicationInitializer
at org.springframework.util.Assert.isAssignable(Assert.java:368)
at org.springframework.util.Assert.isAssignable(Assert.java:351)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:128)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:145)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)

Aguem pode ajudar ?

valeu

Aqui tem um exemplo.
Confira seus arquivos de configuração (web.xml, faces-config.xml, applicationContext.xml)

Segue meu arquivo do spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<context:annotation-config />

<context:component-scan base-package="teste.com.vo" />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="TESTE_MYSQL" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

web.xml

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


TesteSpring

pessoa.xhtml


Faces Servlet
javax.faces.webapp.FacesServlet
1


Faces Servlet
/faces/*

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring-beans.xml</param-value>
</context-param>

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

faces-config.xml

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

</application>

[quote=finotti]Aqui tem um exemplo.
Confira seus arquivos de configuração (web.xml, faces-config.xml, applicationContext.xml)[/quote]
Quando eu estava pesquisando vi esse exemplo, mas não gostei pelos seguintes pontos: excesso de herança, a existência da classe BeanFactory não faz sentido, a da classe Conexao também não, já que está no xml, e o pior, não há integração entre os jsf e o spring.

Isso me motivou a escrever um exemplo mais simples!

Flw! :thumbup:

[quote=von.juliano]Quando eu estava pesquisando vi esse exemplo, mas não gostei pelos seguintes pontos: excesso de herança, a existência da classe BeanFactory não faz sentido, a da classe Conexao também não, já que está no xml, e o pior, não há integração entre os jsf e o spring.

Isso me motivou a escrever um exemplo mais simples!

Flw! :thumbup: [/quote]

Seu exemplo é bacana!
Minha intenção é apenas oferecer um exemplo pra quem está com dificuldades em configurar um projeto com as tecnologias envolvidas. Não deve servir de parâmetro para um projeto sério.

Em relação às críticas:
Acho que a classe BeanFactory faz sentido quando o projeto não utiliza Spring Annotations. Lembre-se que as anotações são razoavelmente “recentes”.
O uso da classe Conexao considero como opcional. Não gosto de manter os parâmetros de conexão no arquivo xml do Spring, mas isso é pessoal. Não digo que seja melhor nem pior, mas não acho que seja sem sentido.
Em relação ao excesso de herança: Como utilizo o hibernate como ferramenta ORM, não vejo problema em herdar da classe HibernateDaoSupport que o Spring oferece. Sei que o ideal é eliminar as dependências, blábláblá. Mas, na prática, a famosa pergunta “E se eu não quiser mais usar esse framework?” nunca ocorreu comigo. Então, se decido usar um framework, não vejo problemas em utilizar a infraestrutura que ele oferece.
Em relação a não haver integração entre jsf e spring, sinceramente não entendi.

Abraço

Olá finotti, até você responder, não tinha notado que era um post seu, e que bom que não se ofendeu ou algo assim.

Sobre a BeanFactory, se é um projeto web, não é necessária, você tem a classe ContextLoaderListener à sua disposição para trabalhar com o contexto nesse cenário. E isso independe do uso ou não das anotações. Mas o maior problema dessa BeanFactory vou explicar mais para o fim. Sobre a Conexao, também não mantenho os dados da conexão no xml, nesse caso acho que o uso de um properties junto com a tag context:property-placeholder mais indicado.

Sobre a herança, não tem a ver com substituir futuramente o hibernate, tem a ver com o design da sua classe. Se eu quiser deletar um objeto com um dao que não deve permitir isso, seria necessário muito trabalho extra para impedir isso, pois sua classe herda comportamento que não deve/precisa. Eu também uso hibernate, mas ao invés de herdar de HibernateDaoSupport, eu injeto HibernateTemplate no construtor. Repare que assim eu tenho o mesmo comportamento que você tem usando getHibernateTemplate(), mas sem precisar de herança para tal. E acredite, essa herança que poderia ser facilmente evitada pode te trazer sérios problemas.

Por fim, o jsf e o spring literalmente não estão integrados. Isso remete a classe BeanFactory novamente, pois se você faz uso dela para obter os objetos que precisa, não está fazendo uso de injeção de dependência, que é justamente para o que o Spring é usado. Ou seja, está usando o JSF e está usando o Spring, mas não está utilizando os dois de forma integrada (e o Spring não está sendo utilizado de forma correta).

Flw! :thumbup:

Sem stress… Depois vou tentar reescrever esse exemplo utilizando o que falou.

WillianPereira vc. conseguiu resolver o problema?
Porque estou passando o mesmo erro e não estou conseguindo de forma alguma resolver =/
Já olhei os tutoriais citados mas não esta de acordo com minha arquitetura. Alguém pode me ajudar? segue os arquivos de configurações.

ERRO:

INFO: Starting Servlet Engine: Apache Tomcat/7.0.14 java.lang.IllegalArgumentException: class javax.faces.component.html.HtmlMessages is not assignable to interface org.springframework.web.WebApplicationInitializer at org.springframework.util.Assert.isAssignable(Assert.java:368) at org.springframework.util.Assert.isAssignable(Assert.java:351) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:128) at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:145) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5206) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.startup.Catalina.start(Catalina.java:620) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>WebProj</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<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>/faces/*</url-pattern>
		<url-pattern>/icefaces/*</url-pattern>
	</servlet-mapping>
	<context-param>
		<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>server</param-value>
	</context-param>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>resources.application</param-value>
	</context-param>
	<!-- <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
		</listener> -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext*.xml</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.PROJECT_STAGE</param-name>
		<param-value>Development</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
		<param-value>false</param-value>
	</context-param>
	<context-param>
		<description>Google Maps API key is required if gMap component is used. Sign up for an API key from http://code.google.com/apis/maps/signup.html</description>
		<param-name>com.icesoft.faces.gmapKey</param-name>
		<param-value>ABQIAAAADlu0ZiSTam64EKaCQr9eTRTOTuQNzJNXRlYRLknj4cQ89tFfpxTEqxQnVWL4k55OPICgF5_SOZE06A</param-value>
	</context-param>
	<servlet>
		<servlet-name>Resource Servlet</servlet-name>
		<servlet-class>com.icesoft.faces.webapp.CompatResourceServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Resource Servlet</servlet-name>
		<url-pattern>/xmlhttp/*</url-pattern>
	</servlet-mapping>
</web-app>

faces-config.xml

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

<faces-config 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-facesconfig_2_0.xsd"
	version="2.0">
	<application>
		<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
	</application>
</faces-config>

Desde ja, Grato!