[英]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)
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)
簡而言之,問題是,
我沒有太大的希望,但是你們看到我哪里做錯了嗎?
提前致謝。
這可能是問題所在。
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.