【问题标题】:HK2 IterableProvider named method not finding ImplementationHK2 IterableProvider 命名方法未找到实现
【发布时间】:2015-03-26 15:56:10
【问题描述】:

我在尝试注入绑定了两个服务的合同时遇到问题。

我正在使用 Jersey,并扩展 ResourceConfig 来配置我的应用程序,我将两个不同的实现(类 FooImpl1FooImpl2)绑定到同一个合约(接口 Foo),并对它们进行排名不同。这些实现中的每一个都使用@Named 及其名称进行注释。

在我的一个控制器中,我想同时访问这两种实现,所以我注入了一个IterableProvider<Foo> fooProvider

如果我不指定任何内容,则始终注入最高级别的实现,这就是我想要的。

当我想要一个具体的实现时,问题就出现了,其中之一。当我调用 fooProvider.named( nameOfTheClass ).get() 时,返回 null,但如果我遍历 fooProvider,我可以访问这两个实现,因此它们被注入。

有人知道我可能缺少什么吗?

非常感谢您的帮助。

【问题讨论】:

  • 代替named( nameOfTheClass ),试试named( namedAnnotationValue ),如javadoc中所述
  • namedAnnotationValue 是与 nameOfTheClass 相同的字符串。

标签: java dependency-injection jersey jersey-2.0 hk2


【解决方案1】:

是的,所以我不确定为什么它不适用于 @Named 注释值,因为这是在 javadoc 中声明的,但不需要任何注释,我们可以在配置名称时配置我们的绑定。我们可以使用named 方法来做到这一点。

register(new AbstractBinder(){
    @Override
    public void configure() {
        bind(Foo1Impl.class).named("foo1").to(Foo.class);
        bind(Foo2Impl.class).named("foo2").to(Foo.class);
    }
});

更新

所以上面的解决方案已经测试过了。如果您仍然遇到问题,请发布一个完整的可运行示例来证明它无法正常工作,如下所示(正在工作)

接口和实现

public interface Greeter {
    String getGreeting(String name);
}

public class EnglishGreeter implements Greeter {
    @Override
    public String getGreeting(String name) {
        return "Hello " + name + "!";
    }
}

public class SpanishGreeter implements Greeter {
    @Override
    public String getGreeting(String name) {
        return "Hola " + name + "!";
    }
}

资源

@Path("greeting")
public class GreetingResource {
    
    @Inject
    private IterableProvider<Greeter> greeters;
    
    @GET
    public Response getResponse(@QueryParam("lang") String lang,
                                @QueryParam("name") String name) throws Exception {
        
        Greeter greeter = greeters.named(lang).get();
        String message = greeter.getGreeting(name);
        return Response.ok(message).build();
    }
}

绑定。我在Feature 中做到了,但在ResourceConfig 中,都是一样的。

@Provider
public class GreetingFeature implements Feature {
    @Override
    public boolean configure(FeatureContext context) {
        context.register(new AbstractBinder(){
            @Override
            public void configure() {
                bind(EnglishGreeter.class).named("english")
                        .to(Greeter.class).in(Singleton.class);
                bind(SpanishGreeter.class).named("spanish")
                        .to(Greeter.class).in(Singleton.class);
            }
        });
        return true;
    }  
}

结果

【讨论】:

  • 其实绑定的时候指定命名注解还是不行。
  • 我在发帖前实际测试过这个
  • 查看更新测试结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2023-01-28
  • 2021-11-25
相关资源
最近更新 更多