2015-08-24 9 views
6

Я создал аспект, который выполняет базовое сопоставление идентификаторов, чтобы гарантировать, что пользователь принадлежит к той же группе, которая создала запрашиваемый объект. У меня был успех, связанный с моим аспектом с методами @Service, но это не имеет смысла на уровне сервиса, и мне нужно, чтобы он был привязан к методам @RestController. Когда я пытаюсь сделать это, все кажется хорошим, но мой Aspect никогда не запускается, и журналы не работают.Spring 4 AOP @Aspect не запускается для @RestController

pom.xml

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>4.1.7.RELEASE</version> 
</dependency> 

контекст весна

<context:annotation-config/> 
<context:component-scan base-package="my.pkg"/> 
<aop:aspectj-autoproxy/> 
<aop:config proxy-target-class="true"/> 

Аспект

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

@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)") 
    public void restController() {} 

    @Pointcut("args(java.security.Principal,..)") 
    public void principalArgPointcut() {} 

    @Around("(controller() || restController()) && principalArgPointcut()") 
    public Object validate(ProceedingJoinPoint point) throws Throwable { 
     doValidationBefore(); 
     Object result = point.proceed(); 
     doValidationAfter(); 

     return result; 
    } 
} 

где "doValidationBefore()" и "doValidationAfter()" будет сгенерировано исключение, если проверка не пройдена ,

И, наконец, мой RestController

@RestController 
@RequestMapping("/my-path") 
public class MyController { 
    @RequestMapping(value = "/{entityId}", method = RequestMethod.GET) 
    public @ResponseBody 
    ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") Long entityId) { 
     return new ResponseEntity(HttpStatus.OK); 
    } 
} 

Некоторые вещи, чтобы отметить:

  • Это точный аспект работы, когда я изменить шаблон выполнения в соответствии услуг и разместить его в своем пакете услуг.
  • Aspect и RestController находятся в одном контексте
  • Я использую IDEA IDE, и когда я использую значок «перейти к рекомендуемым методам» на Aspect, метод, который я тестирую, указан в списке методов ,
  • Ни один из методов, перечисленных в разделе "перейти к консультировали методам" не работают

вещи я пытался:

  • Я добавил 3 библиотеки в моей pom.xml: org.aspectj: aspectjrt: 1.8.6, org.aspectj: aspectjtools: 1.8.6, cglib: cglib: 2.2.2. Ни одна из них не делала любой разницы.
  • Я пробовал определять свои Aspect и PointCuts прямо в контексте xml и удалять аннотации, без разницы.
  • Я попытался установить свой шаблон выполнения для применения ко всем методам, и он все равно не срабатывает.
  • Я попытался добавить интерфейс для моего RestController, без изменений.

Мне бы очень хотелось помочь здесь, так как я пытался это решить уже довольно давно. Я знаю, что это возможно.

ответ

6

Как оказалось, мой Аспект и мои контроллеры на самом деле НЕ были в том же контексте.

В то время как я считал, мои контроллеры должны быть включен в контексте сканировании моего веба-context.xml, они фактически сканируется в WEB-INF/сервлет-context.xml

После того, как я переехал мою конфигурацию Aspect в WEB-INF/servlet-context.xml, мой Aspect начал срабатывать, как ожидалось.

Спасибо всем тем, кто созерцал мою проблему.

+0

Облицовка одной и той же проблемы и не может найти причину. Любые предложения о том, какие конфигурации нужно проверять? –

+0

Ты спас свой день. Я много гулял, но безнадежно, пока не прочитал ваш пост. большое спасибо – anhtuangv

0

Укажите, где ваша служба настроена весной. Если у вас есть я, есть значок, который вы можете щелкнуть, чтобы перейти к конфигурации весеннего компонента. Затем убедитесь, что аспект настроен в том же файле.

Если они определенно определены в том же файле, обратите внимание, что совет pointcutcut соответствует методу, в котором вы ожидаете его запуска. Опять же, Idea имеет значок рядом с pointcut, который будет ориентироваться на соответствующие методы.

 Смежные вопросы

  • Нет связанных вопросов^_^