20

注釈付きコントローラーの後に AOP を使用して何らかの処理を実行しようとしています。すべてがエラーなしで実行されていますが、アドバイスは実行されていません。

コントローラーのコードは次のとおりです。

@Controller
public class HomeController {       
    @RequestMapping("/home.fo")
    public String home(ModelMap model) {
        model = new ModelMap();
        return "home";
    }   
}

およびapplication-configでのセットアップ

<aop:aspectj-autoproxy/>

<bean id="testAdvice" class="com.test.TestAdvice">
</bean>

<bean id="testAdvisor"
    class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
    <property name="advice" ref="testAdvice" />
    <property name="expression" value="execution(* *.home(..))" />
</bean>

そして実際のアドバイス

public class TestAdvice implements AfterReturningAdvice {

    protected final Log logger = LogFactory.getLog(getClass());

    public void afterReturning(Object returnValue, Method method, Object[] args,
            Object target) throws Throwable {
        logger.info("Called after returning advice!");
    }
}

注釈付きのコントローラーについてアドバイスを受けることさえ可能ですか? Spring 2.5を使用しています。

4

3 に答える 3

23

注釈付きコントローラーに関するアドバイスを得ることができます。

で注釈が付けられたクラスのすべてのメソッドの実行後にアドバイスしたいと思います@Controller

次に例を示します。

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class ControllerAspect {

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void controllerBean() {}

    @Pointcut("execution(* *(..))")
    public void methodPointcut() {}

    @AfterReturning("controllerBean() && methodPointcut() ")
    public void afterMethodInControllerClass() {
        System.out.println("after advice..");
    }
}

AspectJ 構文で Spring AOP を使用する場合は、次のような構成ファイルも必要です。

<?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/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="controllerAspect" class="controller.ControllerAspect" />

    <aop:aspectj-autoproxy>
        <aop:include name="controllerAspect" />
    </aop:aspectj-autoproxy>
</beans>

注: Spring AOP では、Spring コンテナーは Spring Bean のみを織ります。オブジェクトが Spring Bean でない場合は、@ControllerAspectJ ウィービングを使用する必要があります。

于 2010-07-23T00:35:08.357 に答える
2

リポジトリのアドバイスが機能しているのと同じ問題がありましたが、コントローラーのアドバイスは機能しませんでした。最後に解決策を見つけました。つまり、AOP 定義が別のコンテキストではなく、サーブレット コンテキストに読み込まれていることを確認する必要があります。

私の場合、Spring AOP 定義は で定義されていtools-config.xmlます。ここから移動したら

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/tools-config.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

ここまで、

<servlet>
    <servlet-name>petclinic</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc-core-config.xml, classpath:spring/tools-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

コントローラーのアドバイスは機能しています。

于 2016-02-25T21:21:23.103 に答える
1

MVC コントローラーの場合、目的を達成するための推奨される方法は、インターセプターを使用することです。http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptorを参照してください。

于 2010-07-22T18:42:42.450 に答える