0

@Controller アノテーションが付けられたクラスで @RequestMapping アノテーションが付けられたすべてのメソッドを選択したいと考えています。

次のポイントカット定義は正常に機能します...場合によっては:

@within(org.springframework.stereotype.Controller)
    and
@annotation(org.springframework.web.bind.annotation.RequestMapping)

問題は、@Controller アノテーションが付けられたクラスが何らかのインターフェースを実装するとすぐに、ポイントカットが適用されなくなり、メソッドが傍受されなくなることです。これは、java.io.Serializable を実装しただけでも発生します。

たとえば、これは機能しませんが、「implements Serializable」を削除するとすぐに機能します。

@Controller
public class TestController extends BaseController implements Serializable {
    @RequestMapping(value = "/test")
    public String testAuth1(final Model model) {
        return "test";
    }
}

春の XML 構成:

<aop:config>
    <aop:pointcut id="handlerMethods"
        expression="@within(org.springframework.stereotype.Controller) and @annotation(org.springframework.web.bind.annotation.RequestMapping)" />
    <aop:aspect ref="handlerAdvice">
        <aop:before method="interceptionMethod" pointcut-ref="handlerMethods" />
    </aop:aspect>
</aop:config>

それについてのアイデアはありますか?ありがとう!

4

1 に答える 1

1

BaseControllerインターフェイスを実装していますか?

インターフェイスの実装を追加するまでcglibプロキシを作成しているように見えるので、それを解決するためのより簡単な試みは次のように追加proxy-target-class = "true"され<aop:config>ます。

<aop:config proxy-target-class="true">
...
</aop:config>

JDKプロキシを使用する場合は、アノテーションをインターフェイスに移動する必要があります。そうしないと、SpringMVCはアノテーションを認識しません。

于 2012-10-24T08:23:54.137 に答える