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
[quote=Lucas Cavalcanti]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[/quote]
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>
[quote=Lucas Cavalcanti]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>
[/quote]
Bacana Lucas!
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…
[quote=Lucas Cavalcanti]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?[/quote]
Foi exatamente isso que pensei! Provavelmente alguma coisa mudou nesta nova versão.
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)