Java - Problema con Spring

   
Vista:

Problema con Spring

Publicado por Al (1 intervención) el 18/04/2008 10:08:17
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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con Spring

Publicado por mario (622 intervenciones) el 18/04/2008 16:14:52
si estas usando spring 2.0 puedes usar un scope de session para definir un bean con el usuario q se logueo

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

y lo recuperas en la clase

UsuarioManagerImpl

http://static.springframework.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes-global-session

saludos comunidad open source
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar