Я создал аспект, который выполняет базовое сопоставление идентификаторов, чтобы гарантировать, что пользователь принадлежит к той же группе, которая создала запрашиваемый объект. У меня был успех, связанный с моим аспектом с методами @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, без изменений.
Мне бы очень хотелось помочь здесь, так как я пытался это решить уже довольно давно. Я знаю, что это возможно.
Облицовка одной и той же проблемы и не может найти причину. Любые предложения о том, какие конфигурации нужно проверять? –
Ты спас свой день. Я много гулял, но безнадежно, пока не прочитал ваш пост. большое спасибо – anhtuangv