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