O problema era o nome do arquivo applicationContext.xml, estava todo em minúsculo, e como o sistemas de arquivo do mac os é case insensitive, funcionanva normalmente.
Estou com um problema ao fazer deploy no servidor, na minha máquina ( mac os X ), funciona perfeitamente, mas quando vou fazer deploy em um ubuntu 10.04, acontece a seguinte exception:
2012-05-04 14:28:34.655:WARN:oejuc.AbstractLifeCycle:FAILED vraptor: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'AppDAO': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.sql.DataSource]: : No matching bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'AppDAO': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.sql.DataSource]: : No matching bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:106)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:87)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:102)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:748)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1222)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:676)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:455)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:36)
at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:183)
at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:491)
at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:138)
at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileChanged(ScanningAppProvider.java:160)
at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileChanged(ScanningAppProvider.java:58)
at org.eclipse.jetty.util.Scanner.reportChange(Scanner.java:658)
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:538)
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:398)
at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:348)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
segue a configuração no applicationcontext:
[code]<?xml version="1.0" encoding="UTF-8"?>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<context:property-placeholder location="classpath:jdbc.properties" />
[/code]
e aqui a classe que está dando erro de injeção de dependência:
[code]@Component
@ApplicationScoped
public final class AppDAO extends BaseDAO<App, Integer> implements AppRepository {
public AppDAO(DataSource dataSource) {
super(dataSource);
}
public List<App> findAll() {
return query("SELECT * FROM APP" );
}
public App find( Integer id ) {
return queryOne("SELECT * FROM APP WHERE id = ?", id );
}
}[/code]
e esta a super classe BaseDAO
[code]public abstract class BaseDAO<T extends DBEntity<?>, V> implements BaseDBRepository<T, V> {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseDAO.class);
protected final JdbcTemplate jdbcTemplate;
public BaseDAO(DataSource dataSource) {
super();
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
protected T queryOne(String sql, Object ...parameters) {
T object = null;
List<T> objects = jdbcTemplate.query(sql, parameters, new Mapper());
if ( objects.size() > 0 ) {
object = objects.get(0);
}
return object;
}
protected List<T> query(String sql, Object ...parameters) {
return jdbcTemplate.query( sql, parameters, new Mapper() );
}
@SuppressWarnings("unchecked")
class Mapper implements RowMapper<T> {
public T mapRow(ResultSet rs, int row) throws SQLException {
T object = null;
try {
Class<?> parameterizedClass = parameterizedType();
object = (T) parameterizedClass.newInstance();
ResultSetMetaData rsmd = rs.getMetaData();
Set<String> columnNames = new HashSet<String>();
//colunm names start from 1
int count = rsmd.getColumnCount() + 1;
for ( int i = 1; i < count; i++ ) {
columnNames.add( rsmd.getColumnName(i).toLowerCase() );
}
for (Method method : parameterizedClass.getDeclaredMethods()) {
for (Annotation annotation : method.getDeclaredAnnotations()) {
if ( annotation instanceof JDBCFieldName ) {
String fieldName = ((JDBCFieldName)annotation).value();
if ( columnNames.contains( fieldName.toLowerCase() ) ) {
setField( object, rs, method, fieldName );
}
}
}
}
} catch (InstantiationException e) {
LOGGER.error("cannot instantiate obejct", e);
} catch (IllegalAccessException e) {
LOGGER.error("cannot access method", e);
}
return object;
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private void setField( T object, ResultSet rs, Method method, String fieldName ) throws SQLException {
Object value = null;
try {
value = rs.getObject(fieldName);
if ( isEnumParameter(method) ) {
value = Enum.valueOf( (Class<Enum>)parameterType(method), (String)value);
}
method.invoke(object, value );
} catch (IllegalArgumentException e) {
LOGGER.error("Illegal argument, expected " + value.getClass().getName(), e);
} catch (IllegalAccessException e) {
LOGGER.error("cannot access method", e);
} catch (InvocationTargetException e) {
LOGGER.error("Invalid target", e);
}
}
private Class<?> parameterizedType() {
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
return (Class<?>) ((ParameterizedType) superclass).getActualTypeArguments()[0];
}
private boolean isEnumParameter( Method method ) {
return parameterType(method).isEnum();
}
private Class<?> parameterType( Method method ) {
return method.getParameterTypes()[0];
}
}[/code]
Grato