[Resolvido]Erros ao gerar tabelas e usuários pelo Spring Security com VRaptor 3.2

8 respostas
Guevara

Oi pessoal!
Estou com um probleminha aqui referente à geração das tabelas e usuários pelo Spring Security com o VRaptor, apesar de gerar corretamente recebo umas exceções que ainda não descobri o motivo.
Criei um DataAccessContext.xml que chama um Bean chamado UserAdminPopulator, que é o responsável por criar as tabelas Usuario e Role, e no meu web.xml chamo o DataAccessContext.xml assim:

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

Ao rodar o Tomcat pelo Eclipse recebo as exceções:

12:16:53,322  INFO [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/dataAccessContext.xml]
12:16:53,738  INFO [DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8b8a47: defining beans [dataSource,dataSourcePopulator]; root of factory hierarchy
12:16:53,835  INFO [DriverManagerDataSource] Loaded JDBC driver: com.mysql.jdbc.Driver
12:16:54,524  INFO [ContextLoader       ] Root WebApplicationContext: initialization completed in 1411 ms
05/12/2010 12:16:54 org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:521)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1068)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:274)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
	at org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:217)
	at org.springframework.web.filter.DelegatingFilterProxy.initFilterBean(DelegatingFilterProxy.java:145)
	at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:179)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:269)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:250)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:368)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4193)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4801)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:988)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:771)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:988)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:275)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:427)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:649)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:585)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:415)

Daqui em diante ele gera td normal, só que no final:

12:16:56,788  INFO [VRaptor             ] VRaptor 3.2.1-SNAPSHOT successfuly initialized
05/12/2010 12:16:56 org.apache.catalina.core.StandardContext startInternal
SEVERE: Error filterStart
05/12/2010 12:16:56 org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/imobiliaria] startup failed due to previous errors
12:16:56,793  INFO [VRaptorApplicationContext] Closing Root WebApplicationContext: startup date [Sun Dec 05 12:16:54 BRST 2010]; parent: Root WebApplicationContext
12:16:56,797  INFO [DefaultListableBeanFactory] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@ec436: defining beans [asmBasedTypeCreator,defaultRoutes,encodingHandlerFactory,defaultAcceptHeaderToFormat,pathAnnotationRoutesParser,defaultMethodNotAllowedHandler,defaultInterceptorHandlerFactory,defaultResourceNotFoundHandler,defaultTypeFinder,hibernateProxyInitializer,defaultDeserializers,objenesisProxifier,defaultTypeNameExtractor,paranamerNameProvider,defaultRestDefaults,validatorFactoryCreator,defaultResourceTranslator,defaultConverters,defaultRouter,XStreamXMLDeserializer,messageInterpolatorFactory,noRoutesConfiguration,defaultMultipartConfig,defaultInterceptorRegistry,JSR303ValidatorFactory,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,commonsUploadMultipartInterceptor,HTMLSerialization,defaultStatus,emptyResult,defaultMethodInfo,defaultHttpResult,flashInterceptor,jstlLocalization,applicationConfiguration,defaultLogicResult,defaultFormatResolver,outjectResult,interceptorListPriorToExecutionExtractor,defaultExceptionMapper,resourceLookupInterceptor,forwardToDefaultViewInterceptor,defaultResult,jsonDeserializer,defaultRepresentationResult,instantiateInterceptor,exceptionHandlerInterceptor,downloadInterceptor,defaultPathResolver,defaultRefererResult,parametersInstantiatorInterceptor,emptyElementsRemoval,deserializingInterceptor,JSR303Validator,defaultValidator,defaultRestHeadersHandler,executeMethodInterceptor,XStreamXMLSerialization,defaultValidationViewsFactory,replicatorOutjector,ognlParametersProvider,XStreamJSONSerialization,defaultPageResult,booleanConverter,bigIntegerConverter,enumConverter,primitiveLongConverter,primitiveIntConverter,primitiveDoubleConverter,localeBasedDateConverter,floatConverter,uploadedFileConverter,longConverter,integerConverter,byteConverter,primitiveBooleanConverter,primitiveCharConverter,doubleConverter,primitiveFloatConverter,localeBasedCalendarConverter,shortConverter,primitiveByteConverter,bigDecimalConverter,primitiveShortConverter,characterConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,defaultRequestExecution,defaultInterceptorStack,entityManagerCreator,entityManagerFactoryCreator,JPATransactionInterceptor,noCacheInterceptor,relatorioDAO,usuarioDAO,fotoDAO,modalidadeDAO,tipoDAO,statusDAO,proprietarioDAO,roleDAO,contatoDAO,imovelDAO,municipioDAO,imagens,busca,jasperMaker,myFirstRequestTask,sendMail,customMultipartConfig,newsletter,parameterLoader,taskSchedulerFactory,myFirstApplicationTask,news,contatoController,proprietarioController,fotoController,municipioController,usuarioController,empresaController,tasksController,relatoriosController,modalidadeController,statusController,loginController,imovelController,indexController,homeController,tipoController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,localeBasedDoubleConverter,localeBasedBigDecimalConverter,localeBasedFloatConverter,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@8b8a47
12:16:56,799  INFO [ThreadPoolTaskScheduler] Shutting down ExecutorService
05/12/2010 12:16:56 org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
12:16:56,809  INFO [XmlWebApplicationContext] Closing Root WebApplicationContext: startup date [Sun Dec 05 12:16:53 BRST 2010]; root of context hierarchy
12:16:56,809  INFO [DefaultListableBeanFactory] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8b8a47: defining beans [dataSource,dataSourcePopulator]; root of factory hierarchy
05/12/2010 12:16:56 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/imobiliaria] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
05/12/2010 12:16:56 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/imobiliaria] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
05/12/2010 12:16:56 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/imobiliaria] appears to have started a thread named [com.google.common.base.internal.Finalizer] but has failed to stop it. This is very likely to create a memory leak.

Seria algum conflito em relação ao registro do driver do MYSQL entre o VRaptor e o processo de geração das tabelas com usuários pelo Spring Security? Outro detalhe é que não posso deixar a tag do DataAccessContext.xml no web.xml pq ao subir novamente a aplicação ele tenta gerar de novo as tabelas e usuários, acusando que as tabelas já existem, teria como criar uma condição pelo VRaptor para que isso não ocorra?
Abraço!

8 Respostas

Lucas_Cavalcanti

vc declarou o filtro do spring security no web.xml? vc declarou o contextLoaderListener?

Guevara

Opa! Beleza Lucas? =)
Tenho no web.xml o conteúdo para o Spring Security:

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

<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

Abraço!!

Lucas_Cavalcanti

talvez isso te ajude:

http://k2studio.com.br/site/2010/09/spring-security/

Guevara

Oi Lucas!
Obrigado pelo link, mas o que está lá eu já fiz, o meu problema é referente à criação das tabelas, pois o Spring Security roda a criação das mesmas antes da execução do sistema ao chamar pelo browser. Se pudesse deixar a criação por conta do sistema e em seguida ele inserir o usuario e role nas tabelas já criadas através do VRaptor e não do Spring Security seria ótimo. A classe que cria as tabelas e insere dois usuários no sistema é esta:

public class UserAdminPopulator implements InitializingBean {
	
	private JdbcTemplate template;
	
	public UserAdminPopulator() {		
	}

	    public void afterPropertiesSet() throws Exception {
	        Assert.notNull(template, "dataSource required");        
	        // insert data here
	        template.execute("CREATE TABLE Role(id_role bigint AUTO_INCREMENT, nome character varying(255)" +
    		", CONSTRAINT role_pkey PRIMARY KEY (id_role));");	   
    
	        template.execute("CREATE TABLE Usuario(id_usuario bigint AUTO_INCREMENT" +
    		", login character varying(255), senha character varying(255)" +
    		", data_inclusao DATE NOT NULL" +
    		", id_role bigint NOT NULL, CONSTRAINT usuario_pkey PRIMARY KEY(id_usuario)" +
    		", CONSTRAINT fk_role_usuario FOREIGN KEY (id_role) REFERENCES role (id_role)" +
    		"MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION);");
    
	        template.execute("INSERT INTO Role (nome) VALUES('ROLE_ADMIN'),('ROLE_GERENTE');");
	        template.execute("INSERT INTO Usuario (data_inclusao,login,senha,id_role) VALUES((select current_date),'admin',MD5('admin'),1),((select current_date),'gerente',MD5('gerente'),2);");
	 
	    }

	    public void setDataSource(final DataSource dataSource) {
	        this.template = new JdbcTemplate(dataSource);
	    }
}

E quem chama esse Bean é aquela tag no web.xml chamando o dataAccessContext.xml. Até aí tudo certo, as tabelas são criadas e os usuários são inseridos, o problema é que esta gerando aquelas exceções que postei, parece que é algum conflito no registro do driver do MySQL. O chato é que não posso deixar o dataAccessContext.xml mapeado na web.xml, preciso comentar após a criação, pois ele tenta criar as tabelas de novo sem necessidade, bem que ele sozinho poderia gerenciar isso melhor. =/

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Role' already exists

Abraço!

Lucas_Cavalcanti

vc só deve executar o código uma vez, da segunda como as tabelas já existem dá pau.
ou seja, esse código deve estar fora da aplicação de preferencia

juniorsatanas

se ajudar : http://www.4shared.com/file/l5gBmQTC/SIGI.html

Guevara

Obrigado pela ajuda pessoal!
Resolvi criar uma classe independente para rodar e inserir os roles e usuários. Essa integração do Spring Security com VRaptor não deu muito certo aqui. Muito xml na WEB-INF, ai pra mudar de banco precisa ir em cada um e alterar os dados do banco, não gostei não… "/
O dia que eles habilitarem annotation para mapear os beans e usar a configuração existente da aplicação, ai vai ficar legal.
Abraço!

juniorsatanas

Ta caminhando para isso cara !

Criado 5 de dezembro de 2010
Ultima resposta 9 de dez. de 2010
Respostas 8
Participantes 3