Problema con Spring

Al
18 de Abril del 2008
Hola,
Estoy desarrollando una aplicación con jsf, spring 2.5.3 e iBATIS y tengo el siguiente problema. El cliente ha solicitado que cada vez que se solicite una conexión al pool se lance automáticamente un "ALTER SESSION" y una "INSERT"sobre la conexión.
Como la gestión de las transacciones esta delegada en Spring mediante la clase "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lo que he hecho es extender la clase que implementa el bean "datasource" y sobreescribir el método getConnection() en la nueva clase.
De esta forma puedo lanzar automaticamente el "ALTER SESSION" cada vez que spring solicita una conexión, pero para lanzar el insert necesito conocer un parametro (concretamente el nombre del usuario que se ha logeado), y no se como hacerselo llegar.

¿Algien me puede ayudar? A continuación coloco el código que tengo actualmente:

Ficheros configuración Spring:

/************************************************************/

<bean id="UsuarioManager" parent="baseTransactionProxy">
<property name="target">
<bean class="com.avan.ejemplo.negocio.UsuarioManagerImpl">
<property name="usuarioDAO" ref="usuarioDAO" />
</bean>
</property >
</bean>

<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributeSource">
<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
</property>
</bean>

<bean id="usuarioDAO" class="com.avan.ejemplo.dao.UsuarioDAOImpl" >
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>
classpath:/sql-map-config.xml
</value>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>

<bean id="dataSource" class="com.avan.ejemplo.ext.spring.MyBasicDataSource" destroy-method="close" >
<property name="driverClassName">
<value>${driver}</value>
</property>
<property name="url">
<value>${url}</value>
</property>
<property name="username">
<value>${username}</value>
</property>
<property name="password">
<value>${password}</value>
</property>
<property name="maxActive">
<value>${maxActive}</value>
</property>
<property name="maxWait">
<value>${maxWait}</value>
</property>
<property name="defaultReadOnly">
<value>${defaultReadOnly}</value>
</property>
<property name="validationQuery">
<value>${validationQuery}</value>
</property>
</bean>

/************************************************************/

Y la clase que he sobreescrito es:

package com.avan.ejemplo.ext.spring;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class MyBasicDataSource extends BasicDataSource {

public MyBasicDataSource() {
// TODO Auto-generated constructor stub
super();
}


@Override
public Connection getConnection() throws SQLException {

Connection conn = super.getConnection();

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO CONEXION (USUSARIO) VALUES (?)");

//AQUI ES DONDE TENGO QUE PONER EL PARAMETRO QUE CONTENGA EL VALOR DEL USUARIO,
//PERO NO SE COMO HACERLO LLEGAR HASTA AQUI
pstmt.setString(1, "USUARIO");

pstmt.execute();
System.out.println("*******************Ejecuta MyBasicDataSource.getConnection");
return conn;
}


}

/************************************************************/

La clase que a la que se ha aplicado aop para la gestion transaccional en la capa de logica de negocio es:

package com.avan.ejemplo.negocio;

import java.util.List;

import com.avan.ejemplo.dao.UsuarioDAO;
import com.avan.ejemplo.domain.UsuarioExample;


public class UsuarioManagerImpl implements com.avan.ejemplo.negocio.UsuarioManager {

private UsuarioDAO usuarioDAO;

public UsuarioDAO getUsuarioDAO() {
return usuarioDAO;
}

public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
this.usuarioDAO = usuarioDAO;
}

public List obtenerListaUsuarios() {

UsuarioExample example = new UsuarioExample();
//Invoca al metodo del DAO que devuelve una lista de usuarios
return usuarioDAO.selectByExample(example);
}


}

/************************************************************/

Y la llamada a la capa de logica de negocio queda algo así:



UsuarioManager usuarioManager = (UsuarioManager)applicationContext.getBean("UsuarioManager");

List listaUsuario = usuarioManager.obtenerListaUsuarios();

/************************************************************/

Pues eso es todo, saludos