我创建了一个Aspect,它执行基本的ID比较,以确保用户属于创建所请求实体的同一组。我已经成功地将自己的方面附加到@Service方法,但是在服务层上没有意义,因此我需要将其附加到@RestController方法。当我尝试执行此操作时,一切似乎都很好,但是我的Aspect从未触发,并且日志处于静默状态。
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
Spring 的背景
<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);
}
}
注意事项:
我尝试过的事情:
org.aspectj:aspectjtools:1.8.6,cglib:cglib:2.2.2。这些都不是
任何区别。
我想在这里提供一些帮助,因为我已经尝试解决此问题已有相当长的时间了。我知道这是有可能的。
最佳答案
事实证明,我的Aspect和Controllers实际上不在同一上下文中。
虽然我认为我的 Controller 将包含在我的web-context.xml的上下文扫描中,但实际上是在WEB-INF/servlet-context.xml中对其进行了扫描
一旦将我的Aspect配置移动到WEB-INF/servlet-context.xml,我的Aspect就开始按预期触发。
感谢所有考虑我的问题的人。
关于spring-mvc - Spring 4 AOP @Aspect不会为@RestController触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32177333/