【问题标题】:HK2 Generic Subclass to NonGeneric Interface BindingHK2 通用子类到非通用接口绑定
【发布时间】:2023-01-28 09:26:13
【问题描述】:

我有 2 个接口和 2 个实现,如下所示。

  • KafkaConsumerExecutor(界面)
  • DefaultExecutor(1 的实施)
  • ConsumerRecordsProcessor(接口)
  • LastOnlyRecordsProcessor(3 个例子)

--

public interface KafkaConsumerExecutor {
        void start();
        void stop();
}

public class DefaultExecutor<MESSAGE_TYPE> implements KafkaConsumerExecutor {
    private final ConsumerRecordsProcessor<MESSAGE_TYPE> consumerRecordsProcessor;

@Override
public void start(){}
    //processStuff
}

@Override
public void stop(){}
    //kill
}

public interface ConsumerRecordsProcessor<MESSAGE_TYPE> {

    void process(Iterable<ConsumerRecord<String, MESSAGE_TYPE>> consumerRecords);
}

--

public class LastOnlyRecordsProcessor<MESSAGE_TYPE extends Serializable> implements ConsumerRecordsProcessor<MESSAGE_TYPE> {
    public void process(Iterable<ConsumerRecord<String, MESSAGE_TYPE>> consumerRecords){
     // process stuff.
    }
}

最后,我有一个我称之为启动执行程序的类。

@Inject
public KafkaListenerManagerImpl(ConsumerExecutor consumerExecutor) {
    this.consumerExecutor= consumerExecutor;
}

我的问题是,我无法将我的通用实现 DefaultExecutor&lt;String&gt; 绑定到 ConsumerExecutor

我尝试的方法是;

1.

bind(new TypeLiteral<DefaultExecutor<String>>() {}).to(new TypeLiteral<ConsumerExecutor>(){});
bind(LastOnlyRecordsProcessor.class).to(new TypeLiteral<ConsumerRecordsProcessor<Request>>() {});

这个失败了 Caused by: java.lang.IllegalArgumentException: argument type mismatch

2.

bind(DefaultExecutor.class).to(new TypeLiteral<ConsumerExecutor>() {});
bind(LastOnlyRecordsProcessor.class).to(new TypeLiteral<ConsumerRecordsProcessor<String>>() {});

这个看起来更好,但是它找不到透视图,但是我没有处理器的绑定。

UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ConsumerRecordsProcessor<MESSAGE_TYPE>,parent=DefaultExecutor,qualifiers={},position=1,optional=false,self=false,unqualified=null,1237264838)
  1.   bind(DefaultExecutor.class).to(new TypeLiteral<ConsumerExecutor>() {});
      bind(new TypeLiteral<LastOnlyRecordsProcessor<String>>() {}).to(new TypeLiteral<ConsumerRecordsProcessor<String>>() {});
    

还是一样;

Caused by: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=ConsumerRecordsProcessor<MESSAGE_TYPE>,parent=DefaultExecutor,qualifiers={},position=1,optional=false,self=false,unqualified=null,202064342)

简而言之,问题是,

  1. 我想将 DefaultExecutor 绑定到 ConsumerExecutor。
  2. LastRecordsOnlyProcessor 到 ConsumerRecordsProcessor

    我没有太大的希望,但是你们看到我哪里做错了吗?

    提前致谢。

【问题讨论】:

    标签: java dependency-injection hk2


    【解决方案1】:

    这可能是问题所在。

     public class Main {
        public static void main(String[] args) {
            Injector injector = Guice.createInjector(new MyModule());
            KafkaListenerManagerImpl kafkaListenerManager = injector.getInstance(KafkaListenerManagerImpl.class);
        }
    }
    class MyModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(new TypeLiteral<ConsumerExecutor<String>>(){}).to(DefaultExecutor.class);
            bind(new TypeLiteral<ConsumerRecordsProcessor<String>>(){}).to(LastOnlyRecordsProcessor.class);
        }
    }
    

    在此示例中,MyModule 类将 DefaultExecutor&lt;String&gt; 实现绑定到 ConsumerExecutor 接口,将 LastOnlyRecordsProcessor 实现绑定到 ConsumerRecordsProcessor 接口。

    改变;

    bind(new TypeLiteral<ConsumerExecutor<String>>(){}).to(DefaultExecutor.class);
    

    到;

    bind(ConsumerExecutor.class).to(DefaultExecutor.class);
    

    bind(new TypeLiteral<ConsumerRecordsProcessor<String>>(){}).to(LastOnlyRecordsProcessor.class);
    

    到;

    bind(ConsumerRecordsProcessor.class).to(LastOnlyRecordsProcessor.class);
    

    您必须确保导入了正确的依赖项和类。

    此外,在 KafkaListenerManagerImpl 类中,您应该注入 ConsumerExecutor&lt;String&gt; 而不是 ConsumerExecutor

    @Inject
    public KafkaListenerManagerImpl(ConsumerExecutor<String> consumerExecutor) {
        this.consumerExecutor= consumerExecutor;
    }
    

    希望有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      相关资源
      最近更新 更多