Я использую 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));
}
}