Kir*_*kov 11 java guice resteasy
例如,RESTEasy的ResteasyWebTarget类有一个方法proxy(Class<T> clazz),就像Injector一样getInstance(Class<T> clazz).有没有办法告诉Guice应该将某些类的创建委托给某个实例?
我的目标是Guice的以下行为:当要求注入器提供A类的新实例时,尝试实例化它; 如果实例化是不可能的,请询问另一个对象(例如ResteasyWebTarget实例)来实例化该类.
我想写一个这样的模块:
@Override
protected void configure() {
String apiUrl = "https://api.example.com";
Client client = new ResteasyClientBuilder().build();
target = (ResteasyWebTarget) client.target(apiUrl);
onFailureToInstantiateClass(Matchers.annotatedWith(@Path.class)).delegateTo(target);
}
Run Code Online (Sandbox Code Playgroud)
代替
@Override
protected void configure() {
String apiUrl = "https://api.example.com";
Client client = new ResteasyClientBuilder().build();
target = (ResteasyWebTarget) client.target(apiUrl);
bind(Service1.class).toProvider(() -> target.proxy(Service1.class);
bind(Service2.class).toProvider(() -> target.proxy(Service2.class);
bind(Service3.class).toProvider(() -> target.proxy(Service3.class);
}
Run Code Online (Sandbox Code Playgroud)
我已经考虑过实现Injector接口并将该实现用作子注入器,但是接口有太多的方法.
我可以编写一个方法来枚举某些包中的所有带注释的接口,并告诉Guice使用提供程序,但这是备份方法.
Guice 不支持这一点,它也没有钩子供你收听。如果找不到绑定,则不会调用它提供的挂钩 ( ProvisionListener& )。TypeListener
我可以编写一个方法,枚举某个包中的所有带注释的接口,并告诉 Guice 为它们使用提供程序,但这是备用方法。
这是你唯一的选择。仅当您愿意将您的target.proxy热爱传播到整个代码库时,可选注入才有效。
编辑(2017-02-28):如果您打算这样做,我已经完成了基础知识,作为我的magic-provider-guice项目的一部分,并提供了JDBI和Feign的示例。
实现 Injector 接口并使用该实现作为子注入器
我不相信你可以设置一个子注入器(只需让 Guice 用一组模块创建一个子注入器),所以这也不起作用。