2017-03-17 19 views
0

Spring AOPとSpring Bootを使用して、休止状態のフィルタを有効にしようとしています。私はスターター点としてこの記事を使用しました。これまでのところ、私はHibernateセッションを傍受することができていないHow to enable hibernate filter for sessionFactory.getCurrentSession()?AOPとSpring Bootを使用してハイバネートフィルタを有効にするには?

:org.hibernate.internal.SessionFactoryImpl.SessionBuilderImpl.openSessionを()。

マイアスペクトクラスには、次のようになります。

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.hibernate.Session; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.stereotype.Component; 

import com.acme.CustomUserDetails; 

@Component 
@Aspect 
public class ACLFilter { 
    Logger log = LoggerFactory.getLogger(ACLFilter.class); 

    @AfterReturning(pointcut = "execution(* org.hibernate.internal.SessionFactoryImpl.openSession(..)))", returning = "session") 
    public void forceFilter(JoinPoint joinPoint, Object session) { 
     Session hibernateSession = (Session) session; 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     Long userId = ((CustomUserDetails) auth.getDetails()).getUserId(); 
     // Session session = em.unwrap(Session.class); 
     hibernateSession.enableFilter("groupACL").setParameter("userId", userId); 
    } 

    @Before("execution(* org.hibernate.SessionFactory.openSession(..)))") 
    public void do2(JoinPoint joinPoint) { 
     System.out.println("############################do2"); 
    } 

    @Before("execution(* org.hibernate.SessionBuilder.openSession(..)))") 
    public void do3(JoinPoint joinPoint) { 
     System.out.println("############################do3"); 
    } 

    @Before("execution(* org.hibernate.internal.SessionFactoryImpl.SessionBuilderImpl.openSession(..)))") 
    public void do4(JoinPoint joinPoint) { 
     System.out.println("############################do4"); 
    } 

} 

これは私が傍受しようとしたすべてのクラス/メソッドです。また、アスペクトクラスがテストクラス/メソッドで正しく動作していることを検証しました。そのため、AOPの設定は正しいです。 デバッグ中に、システムがorg.hibernate.internal.SessionFactoryImpl.SessionBuilderImpl.openSession() をトリガーするのを見ることができますが、インターセプタは起動しません。 マイapplication.propertiesファイルには、このエントリを含める:

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 

私は何をしないのですか?

+0

構文の強調表示に適切な言語を選択するように注意してください。あなたのコードはJavaScript + HTMLではなくJavaです。私はあなたのためにそれを修正しました。 – kriegaex

答えて

1

HibernateクラスはSpringコンポーネントではないため、Spring AOPはそれらに対して機能しません。あなたがそれらを傍受したいのであれば、完全にAspectJ with load-time weavingに切り替えることをお勧めします。また、execution()はHibernateのバイトコードを操作するのではなく、自分のクラスだけを変更するcall()を使うべきではありません。

関連する問題