当前位置: 首页 > 知识库问答 >
问题:

无法通过ProcedingJoinPoint检索注释

管炳
2023-03-14

我想从AOP连接点检索一个注释。我能够通过反射获得注释,但无法通过ProcedingJoinPoint获得注释。

@Around("@annotation(com.annotation.Profile)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    Signature signature = joinPoint.getSignature();
    String methodName = signature.toString();
    Method method = ((MethodSignature) signature).getMethod();

    Profile profile = method.getAnnotation(Profile.class);

    // profile is null here...
    // ......

}   
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
    Method method = SampleServiceImpl.class.getMethod("getTicket", String.class);
    System.out.println(method.getClass().toString());
    System.out.println(method.getAnnotation(Profile.class));
}
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Profile {
    public long skipCount();
    public long sampleSize();
}

我的注释方法

@Override
@Cacheable("test")
@Transactional
@Profile(skipCount = 100, sampleSize = 100)
public Tickets getTicket(String ticketId) {
    return sampleDao.getTicket(ticketId);
}

我的绒球

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jdk.version>1.8</jdk.version>
    <spring.version>4.1.1.RELEASE</spring.version>
    <aspectj.version>1.8.3</aspectj.version>
</properties>

<!-- Spring AOP + AspectJ -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
        </dependency>

共有1个答案

潘安平
2023-03-14

不需要反思,容易多了。您可以将注释绑定到一个建议参数:

@Around("@annotation(profileAnnotation)")
public Object logAround(Profile profileAnnotation, ProceedingJoinPoint thisJoinPoint) throws Throwable {
    System.out.println(thisJoinPoint + " - " +  profileAnnotation);
    // (...)
    Object result = thisJoinPoint.proceed();
    // (...)
    return result;
}

控制台输出可能如下所示:

execution(void de.scrum_master.app.Application.main(String[])) - @de.scrum_master.app.Profile(skipCount=5, sampleSize=11)
 类似资料:
  • 我有一个方面,处理所有有自定义注释的方法。 注释有一个枚举参数,我必须在方面中获得值: 有没有办法从ProcedingJoinPoint获得实现方法的签名?

  • 大约一个小时后,我无法通过下载URL属性检索文件内容。

  • 问题内容: 我有两个模块的应用程序: 有很多与此模块相关的指令,在此不包括在内。该应用程序运行正常。但是,当我尝试检索模块的注入器时: 引发错误: 该应用程序现在很大,我不知道应该在哪里寻找错误。所以我的问题是: 我可能遇到问题的原因 是 什么? 编辑: 我能够复制我的问题:http : //jsfiddle.net/selbh/ehmnt/11/ 问题答案: 在回答问题之前,我们需要注意, 每个

  • 问题内容: 这是一个测试类: 这是我的输出: 我缺少通过反射使注释可见的什么? 我是否仅需要检查它们的存在就需要注释处理器? 问题答案: 为了在运行时访问注释,它需要具有运行时的保留策略。 否则,注释将被丢弃,并且JVM无法识别它们。 有关更多信息,请参见此处。

  • 在我的应用程序中,我有2个transactionManager,创建如下: 在同一个文件中,我有注释驱动的声明: 为了简化admin transactionManager的可用性,我创建了一个简单的注释: 这是我的带有事务注释的方法: 由于有接口,该方法是从另一个类调用的。bean由Spring@Autowired注释注入。jdbcTemplate对象是用以下代码创建的: 我的问题是当我执行jdb

  • 问题内容: 这是我的表的一个例子: 这就是我需要的信息。基本上是它,但在每个“路线”的列中: 我以为我需要一个枢轴,这是我正在尝试学习的,但是我无法在我的一生中拼凑出一个行之有效的简洁查询。 我已经尝试过类似的事情: 但是,这为我提供了“全部”列,无论如何我都不相信它是适当的-它需要“分组”并将各列放在一起,这也是我所坚持的。 有什么我想念的吗?还是有更好的方法来解决这个问题? 谢谢! 问题答案: