Eu tenho uma app web que esta implementada e funciona muito bem com:
- Java 8
- vRaptor 3.5.5
- Spring 4.3.5
- Hibernate 4.3.11
- Maven 3.3.9
- Tomcat 8.5.9
Porém, quando alterei o projeto de single para multi-módulos (Maven) a aplicação parou de funcionar e dá erro em tempo de execução. Aparentemente sobe normalmente, mas quando acesso a primeira página encontro um erro.
Agora tenho 3 módulos (parent, core e web), antes era apenas um módulo comum.
Quando o Apache (embedded no Eclipse / STS) sobe, ele loga normalmente, como logava antes na versão sem modificar, conforme alguns trechos de exemplo. Ou seja, ele reconhece os Controllers.
INFO [BasicConfiguration ] Using class br.com.caelum.vraptor.ioc.spring.SpringProvider as Container Provider
INFO [DefaultSpringLocator] Using an XmlWebApplicationContext, searching for applicationContext.xml
INFO [BasicConfiguration ] br.com.caelum.vraptor.scanning = null
INFO [WebAppBootstrapFactory] Dynamic WebAppBootstrap found.
ERROR [ScannotationComponentScanner] There's no occurence of package br.com.caelum.vraptor.util.hibernate in classpath
INFO [InjectionBeanPostProcessor] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
INFO [LogHelper ] HHH000204: Processing PersistenceUnitInfo [
name: myapp
...]
INFO [Version ] HHH000412: Hibernate Core {4.3.11.Final}
...
...
INFO [SchemaUpdate ] HHH000232: Schema update complete
INFO [DefaultConverters ] Registering bundled converters
INFO [LinkToHandler ] Registering linkTo component
INFO [DefaultRouteBuilder ] /analytics/profile [ALL] -> ProfileController.profile(Integer)
INFO [DefaultRouteBuilder ] /analytics/matches [ALL] -> ProfileController.matches(Integer)
...
...
INFO [VRaptor ] VRaptor 3.5.5 successfuly initialized
org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [http-nio-8080]
org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [ajp-nio-8009]
org.apache.catalina.startup.Catalina start
INFO: Server startup in 15140 ms
Porém, quando vou chamar alguma URL encontro o seguinte erro:
SEVERE: Servlet.service() for servlet [default] in context with path [/myapp] threw exception
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityController': Unsatisfied dependency expressed through field 'securityLogic'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.myapp.security.logic.SecurityLogic' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
...
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.myapp.security.logic.SecurityLogic' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1474)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1102)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1064)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 60 more
Imagino que o erro pode se dever ao fato de que a classe SecurityLogic, que possui anotação @Component do vRaptor3, pertence ao módulo core e o Maven gera um JAR do core que fica dentro do WEB-INF/lib do WAR gerado. Acredito que o vRaptor não está conseguindo fazer o scanning das classes de dentro do meu JAR.
Eu ainda uso a mesma configuração do plugin do WAR com archiveClass = false, mas não rolou. O JAR ainda é criado:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat8-maven-plugin</artifactId>
<version>3.0-r1655215</version>
<configuration>
<!-- VRaptor, by default, only scan classes that does not reside within JARs -->
<archiveClasses>false</archiveClasses>
</configuration>
</plugin>
</plugins>
</build>
Como solucionar este problema?
Grato