需要使用 Dropwizard 中的 guice 进行依赖项注入的帮助。
public class VendorHandlerFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(VendorHandlerFactory.class);
private final Map<Vendor, VendorHandler> vendorHandlerMap;
@Inject
public VendorHandlerFactory(final Set<VendorHandler> vendorHandlers) {
vendorHandlerMap = Maps.uniqueIndex(vendorHandlers, VendorHandler::getVendorType);
}
public VendorHandler getVendorHandler(final Vendor vendor) {
VendorHandler vendorHandler = vendorHandlerMap.get(vendor);
if (vendorHandler == null) {
// do something
}
return vendorHandler;
}
}
Vendor 是枚举,VendorHandler 是一个接口。我有 VendorA 实现 VendorHandler。
我被依赖注入困住了。出现以下错误:
2) [Guice/MissingImplementation]: No implementation for Set<VendorHandler> was bound.
Requested by:
1 : VendorHandlerFactory.<init>
\_ for 1st parameter
at GuiceModule.configure(GuiceModule.java)
\_ installed by: Elements$ElementsAsModule -> GuiceModule
我假设您想在不同的 guice 模块中注册多个
VendorHandler
实现并将它们全部注入 VendorHandlerFactory
中。但 guice 非常严格,无法自动收集所有已注册的实现(如 spring)。您需要使用 guice 多重绑定: 手动将每个实现描述为集合的一部分
Multibinder.newSetBinder(binder(), VendorHandler.class);
uriBinder.addBinding().to(VendorA.class)
注意,每次实现注册调用Multibinder.newSetBinder就可以了(在每个需要注册的引导模块中)。
只有在此之后,您才能将
Set<VenderHandler>
注入所有已注册的实现。
此外,您还可以使用 MapBinder 将处理程序绑定为映射,以便能够将其注入为
Map<Vendor, VendorHandler>
而无需手动转换