首页 > 解决方案 > HK2 命名可选常量参数

问题描述

我们通过 dropwizard 使用 HK2 作为我们的依赖注入框架,因此使用 jersey 2.0。随着 dropwizard 2.0 的升级,似乎有了Optional parameters的新功能。

这破坏了我们注入各种配置字符串的使用,有些是可选的,有些不是。

bind(configuration.getFilesLocation()).to(String.class).named("filesLocation");
bind(configuration.getGeoIpPath()).to(new TypeLiteral<Optional<String>>() {
                                }).named("geoIpPath");
...
public GeoIpUtil(@Named("geoIpPath") Optional<String> geoIpPath) {

所以,这曾经对我们有用。但是现在,通过 Optional 更改,如果configuration.getGeoIpPath()Optional.empty(),那么GeoIpUtil该类将获得configuration.getFilesLocation()价值。因此,看起来当找不到命名注入时,HK2 注入了任何String绑定。所以即使我将代码更改为正确的方式

    if (configuration.getGeoIpPath().isPresent()) {
       bind(configuration.getGeoIpPath().get()).to(String.class).named("geoIpPath");
    }

HK2 仍将注入filesLocation.

有什么办法可以在不引入新类或传递整个configuration对象的情况下解决这个问题?也许是一种让 HK2 严格检查命名绑定的方法?

我尝试注入nullto String.class,但通话立即崩溃。

标签: javajersey-2.0hk2

解决方案


事实上,hk2 的可选注入功能似乎存在一些错误,这些错误已在此处修复https://github.com/eclipse-ee4j/glassfish-hk2/pull/516并且应该是未来版本的一部分


推荐阅读