在 Dropwizard 中使用 guice 进行依赖注入以在构造函数中进行设置

问题描述 投票:0回答:1

需要使用 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
java guice dropwizard dropwizard-guice
1个回答
1
投票

我假设您想在不同的 guice 模块中注册多个

VendorHandler
实现并将它们全部注入
VendorHandlerFactory
中。但 guice 非常严格,无法自动收集所有已注册的实现(如 spring)。您需要使用 guice 多重绑定

手动将每个实现描述为集合的一部分
Multibinder.newSetBinder(binder(), VendorHandler.class);
uriBinder.addBinding().to(VendorA.class)

注意,每次实现注册调用Multibinder.newSetBinder就可以了(在每个需要注册的引导模块中)。

只有在此之后,您才能将

Set<VenderHandler>
注入所有已注册的实现。

此外,您还可以使用 MapBinder 将处理程序绑定为映射,以便能够将其注入为

Map<Vendor, VendorHandler>
而无需手动转换

© www.soinside.com 2019 - 2024. All rights reserved.