Хобрук: Ваш путь к мастерству в программировании

Как я могу объединить @Aspect с @Controller в Spring 3?

Я пытаюсь настроить проект 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. Получил библиотеки:

<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>

добавлен в мой applicationContext.xml:

<aop:aspectj-autoproxy/>

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

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

И начал конкретизировать @Aspect:

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" никогда не печатается.

Может быть, потому что точечные (орфографические?) Объекты должны быть компонентами с пружинным управлением, а мой @Controller в сочетании с DefaultAnnotationHandlerMapping не воспринимается как таковой?

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

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


Ответы:


1

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

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

2

Господи ... наконец-то он заработал!

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

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

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

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

21.10.2010

3

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

...
<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.
}
18.05.2012
  • когда я пытался использовать вышеупомянутый аспект, я получаю следующую ошибку, вызванную: java.lang.IllegalArgumentException: ошибка в :: 0 не может найти указанный контроллер pointcut в org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression (PointcutParser.java:302) в org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression (AspectJExpressionPointcut.java:207) в org.springframework.aop.aspectj.AspectJExpressioncut.buildPointcutPointExpression ............ .................................................. ................. Пожалуйста, предложите 10.08.2015
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..