Vraptor + spring jdbctemplate [resolvido]

0 respostas
C

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:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<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" />

</beans>

e aqui a classe que está dando erro de injeção de dependência:

@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 );
	}
}

e esta a super classe BaseDAO

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];
	}
}

Grato

Criado 4 de maio de 2012
Respostas 0
Participantes 1