0

@Service でアノテーションが付けられたクラスの実行を追跡するアスペクト アドバイスがあります。コードは現在機能していますが、自動配線されたサービスではなく、コントローラーで REST エンドポイントを追跡するように変更したいと考えています。コードは次のとおりです。

@Aspect
public class AuditingAspect
{
    @Pointcut(
            //TODO Change pointcut from public methods in Services to REST endpoints in Controllers
            "execution(public * my.base.package..*.*(..))" //Must be in package
                    //+ " && @within(org.springframework.stereotype.Service)" //Has to be a service
                    + " && @within(org.springframework.stereotype.Controller)" //Has to be a controller
    )
    public void auditLoggingPointCut() {
        //no op
    }

    @Around(value ="auditLoggingPointCut()")
    public Object logAround(final ProceedingJoinPoint joinPoint) throws Throwable
    {
        System.out.println("Exection");

        returnVal = joinPoint.proceed();

        // Now Do The After Logging Part
        afterReturningLog(joinPoint, returnVal) ;

        return returnVal;
    }

    private void afterReturningLog(final JoinPoint joinPoint, final Object returnValue)
    {
        System.out.println("Exiting");
    }
}

「内」を @Service から @Controller に変更すると、アドバイスからの出力は表示されませんが、URL からアクセスするとメソッドが実行されます。実行を無視するコントローラーの違いは何ですか?

コントローラ クラスは次のようになります。

@Controller
public class CaseReferralEndpoints {

    @Autowired
    CaseReferralFacade caseReferralFacade;

    @RequestMapping(value="/backgroundcheck/getcasereferrals", method = RequestMethod.GET)
    @ResponseBody
    public List<CaseReferralSection> getCaseReferrals(@RequestParam("caseID") Long caseID) {
        return caseReferralFacade.getCaseReferrals(caseID); 
    }
}

ここに私の applicationContext-aop.xml があります 完全な構成ははるかに大きくなりますが、これが最も関連性があると思います。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop.xsd">



    <bean class="gov.dhs.uscis.elis2.backend.services.logging.AuditingAspect"/>

    <aop:aspectj-autoproxy proxy-target-class="false" />


</beans>
4

4 に答える 4

1

@within 構成が正しいと仮定すると、問題に対する潜在的な解決策は次のようになります。

<aop:aspectj-autoproxy proxy-target-class="true" />

また、クラスパスにCGLIBを追加する必要があります

コントローラーはインターフェースを実装していないため、上記の手順が必要です

最後に、ルート コンテキストと Web コンテキストがある場合、aop 関連のものを Web コンテキストに適用する必要があります (ルート コンテキストにあると、Web コンテキストで構成されているコントローラーでは機能しません)。

アップデート

Gradle で CGLIB をクラスパスに追加するには、次を追加します。

'cglib:cglib:2.2.2'

Maven では次のようになります。

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2.2</version>
</dependency>
于 2014-04-25T16:11:14.183 に答える
0

あなたのポイントカット式が持っているように

 @within(org.springframework.stereotype.Service)

&& 記号を使用すると、アドバイスはサービスまでのパッケージ内にのみ適用されます。

あなたのコントローラークラスが内部にないことを願っています.Service パッケージ、.*.*Controller パッケージ内にある可能性があるため、コントローラーに対して実行されません

ソリューション ポイントカット式の内側を削除

またはポイントカット式の中にコントローラーを追加する

于 2014-04-25T16:09:22.270 に答える
0

ポイントカットが正しく、2 つのスプリング コンテキストを使用していると仮定します。1 つはサービス/daos (appcontext) 用で、もう 1 つはコントローラー (servletcontext) 用です。

AOP 構成は、宣言/スキャンされたコンテキスト内でのみ適用される Spring Bean の 1 つです。

したがって、コントローラー用の servletcontext.xml があると仮定すると、このコンテキスト内で aop コンテキスト構成を宣言しない限り、ポイントカットは適用されません。

(ポイントカットをサービスに適用する場合は、アプリケーション コンテキストの宣言が必要になります。)

于 2014-04-25T18:14:19.127 に答える