Я работаю на платформе для обработки сообщений, и у меня возникла проблема с привязками Guice.Я написал пример проекта, который отображает проблему, с которой я столкнулся, и это исключение выглядит следующим образом:
1) com.icacarealign.worker_example.PreprocessorMiddleware<MessageType> cannot be used as a key; It is not fully specified.
Вот код:
Интерфейсы
public interface Middleware {
void configure();
}
public interface PreprocessorMiddleware<MessageType> extends Middleware {
void prework(Context<MessageType> contextObj);
}
public interface PostprocessorMiddleware<MessageType> extends Middleware {
void postwork(Context<MessageType> contextObj);
}
Связывание Guice
public class MiddlewareModule<MessageType> extends AbstractModule {
private final List<Class<? extends PostprocessorMiddleware<MessageType>>> _postprocessors;
private final List<Class<? extends PreprocessorMiddleware<MessageType>>> _preprocessors;
public MiddlewareModule(
List<Class<? extends PreprocessorMiddleware<MessageType>>> preprocessors,
List<Class<? extends PostprocessorMiddleware<MessageType>>> postprocessors
) {
_preprocessors = preprocessors;
_postprocessors = postprocessors;
}
@Override
protected void configure() {
bindAllMiddleware(_preprocessors, new TypeLiteral<PreprocessorMiddleware<MessageType>>() {});
bindAllMiddleware(_postprocessors, new TypeLiteral<PostprocessorMiddleware<MessageType>>() {});
}
private <T extends Middleware> void bindAllMiddleware(List<Class<? extends T>> middleware, TypeLiteral<T> type) {
Multibinder<T> multibinder = Multibinder.newSetBinder(binder(), type);
middleware.forEach(middlewareType -> bindMiddleware(multibinder, middlewareType));
}
private <T extends Middleware> void bindMiddleware(Multibinder<T> binder, Class<? extends T> type) {
binder().bind(type).in(Singleton.class);
binder.addBinding().to(type);
}
}
Основной метод
public class Main {
public static void main(String[] args) {
List<Class<? extends PreprocessorMiddleware<Message>>> preprocessorMiddlewares = new ArrayList<>();
List<Class<? extends PostprocessorMiddleware<Message>>> postprocessorMiddlewares = new ArrayList<>();
preprocessorMiddlewares.add(ArbitraryPrepreprocessorMiddleware.class);
postprocessorMiddlewares.add(ArbitraryPostprocessorMiddleware.class);
MiddlewareModule<Message> module = new MiddlewareModule<>(preprocessorMiddlewares, postprocessorMiddlewares);
Injector injector = Guice.createInjector(module);
}
}
Что я делаю не так?