Vraptor + spring jdbctemplate [resolvido]

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