Почему функциональность Observable выполняется дважды за один вызов?

Sat спросил: 03 ноября 2018 в 09:38 в: java-8

Полная структура программы

Аннотация:

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

Затем создан перехватчик:

public class UserInterceptor implements MethodInterceptor {    private static final Logger logger = LoggerFactory.getLogger(UserInterceptor.class);    @Inject
    UserService userService; // this is not working    public Object invoke(MethodInvocation invocation) throws Throwable {
        logger.info("UserInterceptor : Interceptor Invoked");
        Object result = invocation.proceed();
        Observable<List<User>> observable = (Observable<List<Sample>>) result;
        observable.flatMap(Observable::from).subscribe(object -> {
            User user = (User)object
            SampleSender sender = new SampleSender();
            sender.setBoolean(user.isBoolean());
            logger.info("Pushing Data into Sender");
            userService.insert(String.join("_", "key", "value"), sender); 
        }
        return result;
    }
}

Затем я создал GuiceModule, как показано ниже: -

public class UserModule extends AbstractModule {
    @Override
    protected void configure() {
        SampleInterceptor interceptor = new SampleInterceptor()
        requestInjection(interceptor);
        bindInterceptor(Matchers.any(), Matchers.annotatedWith(SampleAnnotation.class), interceptor);
}

}

класс, в котором я использую приведенную выше аннотацию -

// This class also have so many method and this was already declared and using in another services, I created a sample class here
class UserClassForInterceptor {      @Inject
      AnotherClass anotherClass;
      // this userMethod() is not a new method, its already created, 
      // now I am adding annotation to it, because after finishing this functionality, 
      // I want something should be done, so created annotation and added here
      @UserAnnotation
      public Observable<List<Sample>> userMethod() {
            logger.info("This is printing only once");
            return anotherClass.getUser().flatMap(user ->{
                logger.info("This is also printing twice");
                // this logger printed twise means, this code snippet is getting executed twise
            });
      }
}public class AnotherClass{
          public Observable<User> getUser(){
           Observable<Sample> observableSample = methodReturnsObservableSample();
           logger.info("Getting this logger only once");
           return observableSample.map(response-> {
               logger.info("This logger is printing twice");
               //here have code to return observable of User
           });
      }
}

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

У меня есть RestModule, с помощью которого я связываю UserClassForInterceptor следующим образом

public final class RestModule extends JerseyServletModule {
    // other classes binding
    bind(UserClassForInterceptor.class).in(Scopes.SINGLETON);
    // other classes binding
    install(new SampleModule());
}

Теперь у меня есть класс начальной загрузки, в котором я связываю RestModule

public class Bootstrap extends ServerBootstrap {
   binder.install(new RestModule());
}

Использование: -

@Path("service/sample")
public class SampleRS {
    @Inject
    UserClassForInterceptor userClassForInterceptor;    public void someMethod() {
        userClassForInterceptor.sampleMethod();
    }
}

0 ответов