簡體   English   中英

HK2 通用子類到非通用接口綁定

[英]HK2 Generic Subclass to NonGeneric Interface Binding

我有 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.
    }
}

最后,我有 class,我在其中調用啟動執行程序。

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

我的問題是,我無法將我的通用實現DefaultExecutor<String>綁定到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

我沒有太大的希望,但是你們看到我哪里做錯了嗎?

提前致謝。

這可能是問題所在。

 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 class 將DefaultExecutor<String>實現綁定到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 class 中,您應該注入ConsumerExecutor<String>而不是ConsumerExecutor

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

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM