Как я могу объединить @Aspect с @Controller в Spring 3? - PullRequest
7 голосов
/ 21 октября 2010

Я пытаюсь настроить проект Spring 3 Web MVC, используя @Controller, подход, основанный на аннотациях.

package my.package

@Controller
@RequestMapping("/admin/*")
public class AdminMultiActionController {

@RequestMapping(value = "admin.htm", method = RequestMethod.GET)
public String showAdminSection() {
    return "admin";
}

Мой диспетчер-сервлет имеет следующие обработчики контроллера:

<context:component-scan base-package="my.package" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

Веб-приложение работает нормально с поставляемыми артефактами Maven:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.0.2.RELEASE</version>
</dependency>

Теперь я хотел добавить @AspectJ AOP. Я получил libs:

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.9</version>
</dependency>

добавлено в мое приложениеContext.xml:

<aop:aspectj-autoproxy/>

Обязательно создайте соответствующий bean-компонент в applicationContext.xml:

<bean id="securityInterceptor" class="my.package.service.SecurityInterceptor"/>

И начал излагать @Аспект:

package my.package.service

@Aspect
public class SecurityInterceptor {

@Pointcut("execution(* showAdminSection(..))")// the pointcut expression
private void foo() {
    System.out.println("fooo");
}// the pointcut signature

Теперь это то место, где оно перестало работать. «fooo» никогда не печатается.

Может быть, потому что объекты с точечным вырезанием (правописание?) Должны быть bean-bean-компонентами, а мой @Controller в сочетании с DefaultAnnotationHandlerMapping не воспринимается как таковой?

Любая помощь будет оценена. Если я забыл включить какую-либо информацию, пожалуйста, спросите. Надеюсь, что кто-то может помочь мне здесь.

Большое спасибо!

Ответы [ 3 ]

8 голосов
/ 22 октября 2010

Боже мой ... наконец-то все заработало!

Спасибо за ваш ответ Affe!

Для любопытных:

  1. Не используйте компонентное сканированиеи обработчики аннотаций по умолчанию для получения ваших контроллеров
  2. Подключите их весной xml
  3. Не указывайте контроллеры в диспетчере-сервлете, пока конфиг aop находится в applicationContext.
  4. Moveоба к диспетчеру-сервлету

  5. Конечно, Аффе прав: не забывайте совет: p

7 голосов
/ 18 мая 2012

Во-вторых, chzbrgla, для тех, кто просматривает это позже (как и я), моя проблема была решена после перемещения сканирования компонентов контроллера и aop config в сервлет диспетчера следующим образом:

...
<context:component-scan base-package="com.mypackage.controller"/>
<!--  Configure aspects. -->
<bean id="myAspect1" class="com.mypackage.intercept.SiteAccessAspect"/>

<aop:aspectj-autoproxy proxy-target-class="true">
    <aop:include name="myAspect1" />
</aop:aspectj-autoproxy>
...

Как видите, компонентное сканирование все еще работало в моем случае. Переход к диспетчерскому сервлету решил это за меня.

Apspect (в данном случае myApect1) был настроен следующим образом:

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

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

@Before("controller() && method()")
public void doAccessCheck(JoinPoint joinPoint) {
System.out.println(joinPoint.getSignature()); // For testing purposes.
}
4 голосов
/ 22 октября 2010

Метод pointcut определяет pointcut, он не вызывается при совпадении, вам нужно определить, что на самом деле должно произойти. например.,

@Before("foo()")
public void beforeFoo(JoinPoint joinPoint) {
    System.out.println("foooo");
}
...