Сбой ввода Guice с модулем аннотации Guice - PullRequest
0 голосов
/ 10 ноября 2018

Я использую Google Guice для инъекций большую часть своего кода, и он работал нормально , пока я не сделал аннотацию Google Guice .

Сам код является веб-службой jax-rs , где я передаю 2 параметра заголовка userId и adminId, а затем извлекаю данные из базы данных Oracle. Идея с аннотацией состоит в том, что я бы определил, сколько времени занимают определенные сегменты кода. userId передается в аннотацию и выходит из системы вместе с классом и количеством времени, которое требуется для выполнения кода.

Проблема в том, что когда я добавил этот код, он вызвал сбой одного из модулей guice, что привело к сбою всех остальных модулей guice в проекте.

Очень простой код

Самый низкий класс, вызываемый для вызовов базы данных public class lowestClass { public static lowestClass create(final String userId){ final Injector injector = Guice.createInjector(new LowestClassModule(userId)); return injector.getInstance(lowectClass.class); } @LogTimerMeasurement public DataInfo getDataInfo() { //populates a DataInfo object with info from database } } Модуль самого низкого класса

public class lowestClassModule {
  public final String adminId;
  public final String userId;

  public lowestClassModule(final String adminId, final String userId){
    this.adminId = adminId;
    this.userId = userId;
  }

  public lowestClassModule(final String userId){
    this.adminId = "NoAdminId";
    this.userId = userId;
  }

  @Override
  protected void configure(){
    install(new TimerBindingModule(userId));
  }
}

бюргерский

public class upperClass {
  @LogTimerMeasurement
  public DataResponse getDataResponse(){
    //Calls lower class gets DataInfo object and returns DataResponse object
  }

  //Guice module for endpoint
  public static class Module extends AbstractModule{
    private final String adminId;
    private final String userId;

    public Module(final String userId){
      this.adminId = "NoAdminId";
      this.userId = userId;
    }

    public Module(final String adminId, final String userId){
      this.adminId = adminId;
      this.userId = userId;
    }

    @Override
    protected void configure(){
      install(new TimerBindingModule(userId));
      bind(lowestClass.class).toInstance(lowestClass.create(userId));
    }
  }
}

Guice Аннотация

Интерфейс аннотации

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogTimerMeasurement {

}

Перехватчик аннотаций

public class LogTimerMeasurementInterceptor implements MethodInterceptor {
    private final String userId;

    public LogTimerMeasurementInterceptor(final String userId){
        this.userId = userId;
    }

    @Override
    public Object invoke(final MethodInvocation invocation) throws Throwable {
        final Method method = invocation.getMethod();
        final String methodName = method.getName();
        final Class<?> declaringClass = method.getDeclaringClass();

        final I18N supplyI18n = I18NFactory.createI18N(this.getClass());

        final long startTime = System.currentTimeMillis();
        try{
            return invocation.proceed();
        }catch (final Exception e){
            supplyI18n.log(getClass() + "timerError", "\n{0} : {1} :: Unable to log time due to {1}",declaringClass + "." + methodName, userId, e);
            return invocation.proceed();
        }finally {
            final long endTime = System.currentTimeMillis();
            supplyI18n.log("timerMessage", "\n{0} : {1} :: Process completed in {2} milliseconds", declaringClass + "." + methodName, userIf, endTime - startTime);
        }
    }
}

Модуль аннотации

public class TimerBindingModule extends AbstractModule {
    private final String userId;

    public TimerBindingModule(final String userId) {
        this.userId = userId;
    }

    @Override
    protected void configure() {
        bindInterceptor(Matchers.any(), Matchers.annotatedWith(LogTimerMeasurement.class), LogTimerMeasurementInterceptor.create(userId));
    }
}
...