3

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();         
        }
    }
} 
4

2 に答える 2

3

以下のタグを xml ファイルに追加したかどうかを確認します。

aop:aspectj-autoproxy

また、この ConnectionAspect クラスの xml 内に Bean 定義を追加したかどうかも確認してください。

于 2012-10-14T12:58:30.053 に答える
1

はい、私には考えがあります:実際にあなたのポイントカットは目的の呼び出しと一致しますが、それらは( javaxパッケージのように) デフォルトでウィービングから除外されているJavaパッケージにあります。

コマンドラインaop.xmlを介してその制限を取り除く方法がありますが、クラスローディングに関する潜在的な問題に注意してください。Java クラスをロードするクラスローダにweaver がアタッチされていることを確認する必要があります。そのため、LTW を使用しないオプションがある場合は、JDK クラス ファイルを織り込んでそれらの織り込まれたクラスを使用すれば問題ありません。そうしないと、「鶏と卵」の問題が発生する可能性があります。

于 2012-08-21T23:35:30.757 に答える