我在使用AspectJ时遇到了一些问题! 我想为@MyAnnotation注释的方法创建一个log方法。
MyAnnotation.java:
@Aspect
public class MyAspect {
private static Logger logger = Logger.getLogger(MyAspect.class.getName());
@Pointcut("@annotation(com.utils.aop.annotations.MyAnnotation)")
public void logMyAspect() {
}
@Before("logMyAspect()")
public void logMethod(JoinPoint jp) {
String methodName = jp.getSignature().getName();
logger.info("Executing method: " + methodName);
}
}
MyAspect.java:
@RolesAllowed({ "DEV", "GUI", "API" })
@POST
@Path("/getList")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@MyAnnotation
public Response getList(@Context final ContainerRequestContext requestContext,
FilterAndSortObject filterAndSortObject,
@QueryParam("offset") final int offset,
@QueryParam("limit") final int limit)
{
...
}
我在项目的某些服务方法之前使用了我的@MyAnnotation:
@Configuration
@EnableAspectJAutoProxy
public class ServletContextClass implements ServletContextListener {
final static Logger logger = Logger.getLogger(ServletContextClass.class);
@Override
public void contextInitialized(final ServletContextEvent sce) {
...
}
...
}
我也看到我应该在配置类中使用@EnableAspectJAutoProxy:
logMethod(JoinPoint jp)
然而它似乎不起作用。它没有记录任何东西!
我在{{1}}中使用断点并检查结果,但没有成功!
有谁知道为什么这不起作用?
答案 0 :(得分:0)
您不必将切入点和处理程序方法分开;事实上,我确信这是导致你的问题的原因。以下方面应该可以正常工作:
@Aspect
public class MyAspect {
private static Logger logger = Logger.getLogger(MyAspect.class.getName());
@Before("@annotation(com.utils.aop.annotations.MyAnnotation)")
public void logMyAspect(JoinPoint jp) {
String methodName = jp.getSignature().getName();
logger.info("Executing method: " + methodName);
}
}
如果需要参数,您还可以检查注释值:
@Before("@annotation(a)")
public void logMyAspect(JoinPoint jp, MyAnnotation a) {
// conditional logging based on annotation contents
}