春3.0 / AOP / AspectJ的:自动代理截获到的getConnection任何呼叫()(

2019-06-27 05:49发布

我试图拦截任何的getConnection()方法来设置DBMS indentifier。 我实现了一个方面得到它,但我没有得到任何东西。 任何的想法? 谢谢!

import java.sql.CallableStatement;
import java.sql.Connection;

import javax.servlet.http.HttpSession;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import es.iberia.tryp.model.entities.Usuario;

@Component
@Aspect
public class ConnectionAspect {

    @AfterReturning(value = "execution(java.sql.Connection javax.sql.DataSource+.getConnection(..))", returning = "connection")
    //@AfterReturning(value = "execution(java.sql.Connection org.springframework.jdbc.datasource.*.*(*))", returning = "connection")
    //@AfterReturning(value = "execution(java.sql.Connection java.sql.Connection *(..))", returning = "connection")
    //@AfterReturning(value = "execution(java.sql.Connection org.springframework.jdbc.datasource.DriverManagerDataSource.*(..))", returning = "connection")

    public void prepare (Connection connection) throws Throwable {

        HttpSession httpSession = (HttpSession) RequestContextHolder.currentRequestAttributes().resolveReference(RequestAttributes.REFERENCE_SESSION);

        if (httpSession!=null && (Usuario)httpSession.getAttribute("usuario")!=null && ((String)((Usuario)httpSession.getAttribute("usuario")).getNomina())!=null) {
            String nomina = (String)((Usuario)httpSession.getAttribute("usuario")).getNomina();
            String prepSql = "{ call DBMS_SESSION.SET_IDENTIFIER('" + nomina +"') }";
            CallableStatement cs = connection.prepareCall(prepSql);                             
            cs.execute();
            cs.close();         
        }
    }
} 

Answer 1:

是的,我有一个想法:其实你的切入点匹配所需的电话,但他们在其中(如使用javax包),默认情况下,排除纺织Java包。

有一种方法来消除通过该限制命令行和aop.xml文件 ,但请注意的有关类加载的潜在问题。 你必须确保类加载器加载Java类有一个附加织工 ,所以如果你还没有使用LTW的选项,只是编织JDK类文件,并使用这些编织类,你会被罚款。 否则,你可能有一个“鸡和蛋”的问题。



Answer 2:

检查是否已在XML文件中加入下面的标签。

AOP:AspectJ的自动代理

另外,请检查您是否添加了XML这个ConnectionAspect类中的bean定义。



文章来源: Spring 3.0 / AOP / Aspectj:autoproxy intercept any call to getConnection()