ola
como esta sua configuracao no web.xml? qual a versao do vraptor? o spring é 3?
estranho, parece que tudo esta sendo registrado duas vezes, com nomes diferentes.
abracos
ola
como esta sua configuracao no web.xml? qual a versao do vraptor? o spring é 3?
estranho, parece que tudo esta sendo registrado duas vezes, com nomes diferentes.
abracos
duas coisas:
vc tá registrando o OpenEntityManagerInViewFilter duas vezes… isso vai dar inconsistência na sua aplicação
e vc não precisa registrar o org.springframework.web.context.ContextLoaderListener pois o VRaptor já faz isso pra vc… ao registrar 2 vezes dá pau
[]'s
ola
basta ter um application-context.xml que o vraptor, através do scanning do spring, alem de procurar componentes vraptor, vai procurar componentes spring com anotacoes e tambem pelo application-context.xml
acredito que seja só mudar a ordem dos filtros… provavelmente colocando o OpenEntityManagerInView depois do VRaptor funcione…
Olá senhores,
Só revivendo um pouco o tópico, eu estou tendo este mesmo problema. O contexto do Spring (3.0.2) somente é levantado se eu declaro o Listener dele no web.xml. O SpringProvider do VRaptor3 parece não estar encontrando meus applicationContext*.xml (localizados no /WEB-INF/config/spring):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/spring/applicationContext*.xml</param-value>
</context-param>
Se eu coloco no src com o nome de applicationContext.xml o VRaptor encontra, mas em compensação eu teria que trabalhar somente um applicationContext.xml ou estender o SpringProvider padrão.
Provavelmente alguma coisa mudou com essa versão do Spring 3.x, pois olhei o código do SpringDefaultLocator do VRaptor3 e o que ele faz é bem simples e esperado.
Enfim, se eu declaro o Listener do Spring eu tenho o problema relatado nessa thread.
Alguma dica, Jedi Masters? (-:
se vc precisa trabalhar com mais de um applicationContext, vc precisa estender o SpringProvider, sobrescrevendo o método getParentApplicationContext, infelizmente…
esse problema dos dois ServletContexts já foi corrigido… vc pode baixar um snapshot com a correção:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.2-SNAPSHOT/
ou esperar mais alguns dias para baixar a versão 3.1.2 final
[]'s
se vc precisa trabalhar com mais de um applicationContext, vc precisa estender o SpringProvider, sobrescrevendo o método getParentApplicationContext, infelizmente…esse problema dos dois ServletContexts já foi corrigido… vc pode baixar um snapshot com a correção:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.2-SNAPSHOT/ou esperar mais alguns dias para baixar a versão 3.1.2 final
[]'s
Ok Lucas,
Na verdade o que eu gostaria mesmo era evitar estender o SpringProvider para trabalhar com vários applicationContexts, mas se em último caso fosse necessário não haveria tantos problemas assim!
Estarei baixando o snapshot da vesão 3.1.2. Assim que sair a versão final eu atualizo!
Obrigado pela força!
acho que vc pode também criar um applicationContext.xml no classpath com o conteúdo parecido com:
<beans>
<import resource="/WEB-INF/config/spring/applicationContext.xml"/>
<import resource="/WEB-INF/config/spring/applicationContext-abc.xml"/>
<import resource="/WEB-INF/config/spring/applicationContext-def.xml"/>
</beans>
acho que vc pode também criar um applicationContext.xml no classpath com o conteúdo parecido com:
<beans> <import resource="/WEB-INF/config/spring/applicationContext.xml"/> <import resource="/WEB-INF/config/spring/applicationContext-abc.xml"/> <import resource="/WEB-INF/config/spring/applicationContext-def.xml"/> </beans>
Imaginei que isso fosse possível, mas não cheguei a pesquisar sobre!
Essa sintaxe acima você pegou da documentação ou você só quis passar a idéia?
foi o primeiro hit do google, veio de um forum… mas parece que a sintaxe é essa mesmo…
Lucas,
O VRaptor3 ainda continua não levantando o contexto do Spring 3.x na inicialização do servidor, contudo ao declarar o Listener do Spring no web.xml a aplicação funciona normalmente sem problemas. Aquele erro do ServletContext foi resolvido!
Se puder explicar, esse erro estava relacionado a exatamente o que?
de qqer forma, quando vc usa um spring listener, essa linha que está no DefaultSpringLocator deveria achar o contexto que o listener abriu:
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
será q isso não funciona no spring 3?
o erro do ServletContext era pq o vraptor registrava uma instancia dele no container sem ver se já existia um registrado… agora ele verifica…
de qqer forma, quando vc usa um spring listener, essa linha que está no DefaultSpringLocator deveria achar o contexto que o listener abriu:ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);será q isso não funciona no spring 3?
Entendi, valeu pela força e pelo tempo!
Minha aplicação está utilizando VRaptor 3.1 com integração com beans gerenciados exclusivamente pelo Spring, inclusive o datasource.
Ao tentar acessar algum recurso estou tomando este erro. A classe EncodingHandlerFactory tem uma dependência com o ServletContext, porém, como o trace informa, existem DOIS, mesmo não fazendo qualquer referência direta, na minha aplicação, a esta API.
Sugestões são bem vindas
2010-01-23 21:23:27.139::WARN: /juriprev-0.1/
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘br.com.caelum.vraptor.http.EncodingHandlerFactory’: FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘encodingHandlerFactory’: Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.servlet.ServletContext]: : No unique bean of type [javax.servlet.ServletContext] is defined: expected single matching bean but found 2: [javax.servlet.ServletContext, servletContext]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.servlet.ServletContext] is defined: expected single matching bean but found 2: [javax.servlet.ServletContext, servletContext]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:150)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1387)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:244)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
at br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:240)
at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:58)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:90)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:285)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:821)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:368)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Paulo
A versão VRaptor é como citei ao abrir o tópico, 3.1, que já vem com a distribuição do Spring 3 também. Segue meu web.xml. (Eu já comentei o Servlet do Tiles e deu o mesmo erro)
<?xml version="1.0" encoding="UTF-8"?>
ticred
<!-- Filtro do Open Session In View controlado pelo Spring -->
<filter>
<display-name>Open EntityManager In View Filter</display-name>
<filter-name>OpenEntityManagerInView</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenEntityManagerInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
Configuração do Spring
-->
<filter>
<filter-name>transactionFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>transactionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--
Tiles
-->
<context-param>
<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
<param-value>/WEB-INF/conf/tiles.xml</param-value>
</context-param>
<servlet>
<servlet-name>TilesServlet</servlet-name>
<servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!--
Servlet que responde as requisições do tiles
-->
<servlet>
<servlet-name>TilesDispatchServlet</servlet-name>
<servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TilesDispatchServlet</servlet-name>
<url-pattern>*.tiles</url-pattern>
</servlet-mapping>
<!-- configura o controlador do VRaptor -->
<filter>
<filter-name>vraptor</filter-name>
<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>
<filter-mapping>
<filter-name>vraptor</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!--
-->
<welcome-file-list>
<welcome-file>/jsp/index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/jsp/common/construction.jsp</location>
</error-page>
Valeu Lucas!
Realmente dei mole com a parada do OpenEntityManagerInViewFilter … rs
Quanto a registrar o listener do Spring, caso eu não declare recebo o seguinte erro:
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(WebApplicationContextUtils.java:82)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.lookupEntityManagerFactory(OpenEntityManagerInViewFilter.java:148)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.lookupEntityManagerFactory(OpenEntityManagerInViewFilter.java:133)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:92)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:285)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:821)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:368)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Quando eu comento o OpenEntityManagerInView ele funciona. Como indicar que o applicationContext do VRaptor está cuidando disso? Acredito que ao instanciar o filtro o do VRaptor ainda não inicializou o ApplicationContext.
Outra dúvida é como informar ao VRaptor que eu terei algumas coisas definidas manualmente gerenciadas pelo Spring através de um arquivo, por exemplo, application-context.xml.
Digamos que terei alguns aspectos declarados, como proceder?
Obrigado a todos, funcionou! 
O problema agora é que, mesmo declarando usuario/senha no persistence.xml e sobrescrevendo o SpringProvider e declarando no web.xml, ele não obtém a conexão, informando que não configurei tais parametros (usuario/senha).
Obs: Existe um Provider para JPA com tais utilitarios, mas preferi declará-los explicitamente.
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="default"
transaction-type="RESOURCE_LOCAL">
<properties>
<!-- Scan for annotated classes and Hibernate mapping XML files -->
<property value="class, hbm" name="hibernate.archive.autodetection" />
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/juricred" />
<property name="hibernate.username" value="root" />
<property name="hibernate.password" value="" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
public class VRaptorSpringProvider extends SpringProvider {
/**
*
*/
@Override
protected void registerCustomComponents(ComponentRegistry registry) {
registry.register(EntityManagerCreator.class, EntityManagerCreator.class);
registry.register(EntityManagerFactoryCreator.class, EntityManagerFactoryCreator.class);
registry.register(JPATransactionInterceptor.class, JPATransactionInterceptor.class);
}
}
trace:
Caused by: java.sql.SQLException: Access denied for user ‘’@‘localhost’ (using password: NO)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3536)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3468)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:917)
at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3974)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1282)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2142)
at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:773)
at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:352)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
OK. Tudo funcionando perfeitamente.
Correto é:
É minha primeira experiência com o VRaptor3 e, portanto, pretendo ir postando sobre este projeto.
Obrigado