Tapestry自定义装饰器:不被调用

时间:2018-08-31 17:44:10

标签: java decorator tapestry

按照此处的说明http://tapestry.apache.org/tapestry-ioc-decorators.html,我创建了一个自定义注释修饰符,如下所示: 并将其添加到应用的模块中

  @Decorate
  @TimeIt
  public static <T> T decorateTimer(Class<T> serviceInterface, T delegate,
      String serviceId, Logger logger,
      TimerDecorator decorator) {
    return decorator.build(serviceInterface, delegate, serviceId, logger);
  }

对于TimerDecorator,我遵循与Tapestry的LoggingDecoratorImpl库相同的代码

但是;当我用@TimeIt标记服务(和/或服务中的方法)时,不会被调用

我需要将此装饰器“贡献”到某些应用默认值吗?有人可以举一个例子说明我该怎么做吗?

我也尝试过使用“顾问”进行同样的想法,而且似乎也没有被引用

  @Advise
  @TimeIt
  public static void adviseTimer(MethodAdviceReceiver receiver) {
    MethodAdvice advice = invocation -> {
      long start = System.currentTimeMillis();
      invocation.proceed();
      long end = System.currentTimeMillis();
      System.out.println(invocation.getMethod().getName() + " took: " + (end - start) + " [ms]");
    };
    receiver.adviseAllMethods(advice);
  }

编辑

当我如下注释时,我的装饰器被调用

  @Decorate
  @Match("ASpecificManager")
  public static <T> T decorateTimer(...)

所以我想知道我编写的TimeIt接口是否有问题?

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@UseWith(AnnotationUseContext.SERVICE)
public @interface TimeIt {
}

这是我的用法:

@TimeIt
public class ASpecificManagerImpl implements ASpecificManager {
...
}

EDIT#2

似乎像这样使用它

@Marker(TimeIt.class)
public class ASpecificManagerImpl implements ASpecificManager {
...
}

但是,这建议类中的所有方法...将其放在类的特定方法上仍会建议所有方法。我不能将此注释放在类的特定方法上(即仅方法)我想计时的服务)?

0 个答案:

没有答案