【问题标题】:Dependency injection using guice in Dropwizard for set in constructor在 Dropwizard 中使用 guice 进行依赖注入以在构造函数中设置
【发布时间】:2022-07-29 15:02:47
【问题描述】:

在 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】:

    我假设您想在不同的 guice 模块中注册多个 VendorHandler 实现,并将它们全部注入 VendorHandlerFactory。但是 guice 非常严格,不能自动收集所有注册的实现(如 spring)。您需要使用guice multibindings 手动将每个实现描述为集合的一部分:

    Multibinder.newSetBinder(binder(), VendorHandler.class);
    uriBinder.addBinding().to(VendorA.class)
    

    请注意,可以为每个实现注册调用 Multibinder.newSetBinder(在需要注册的每个指南模块中)。

    只有在那之后,您才能将Set&lt;VenderHandler&gt; 注入所有已注册的实现。

    此外,您可以使用MapBinder 将处理程序绑定为映射,以便能够将其注入为Map&lt;Vendor, VendorHandler&gt; 而无需手动转换

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多