跟我上一个问题的后续行动.我正在尝试使用JSR-330标准注释和与泽西捆绑的HK2框架注入应用程序配置数据.
理想情况下,我想InjectionResolver为Named注释创建一个自定义,它将在一个Map或Properties对象中查找所需的值,我将从其他地方读取的数据中填充.在我的第一次尝试中,我创建了一个Application像
public class MyApplication extends ResourceConfig {
...
packages(MY_PACKAGES);
property(MY_CONFIG_PROPERTY, someValue);
register(new AbstractBinder() {
@Override
protected void configure() {
bind(ConfigurationInjectionResolver.class)
.to(new TypeLiteral<InjectionResolver<Named>>(){})
.in(Singleton.class)
}
});
}
Run Code Online (Sandbox Code Playgroud)
然后我的InjectionResolver样子
public class ConfigurationInjectionResolver implements InjectionResolver<Named> {
@Context Application application;
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> serviceHandle) {
// lookup data in application.getProperties();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题application.getProperties()是空的.知道什么是错的吗?另外,我可以绑定我的Injector实例而不是绑定类吗?这样我就可以构造将我的Map数据作为参数传递的实例.
我正在编写一个公开REST API的简单微服务.所以我开始与泽西岛合作,当然我需要将我的对象注入球衣资源.基本上我有2个类定义了一组资源,其中一些需要使用另一个服务.
基本上我有:
public interface MyService {
String getServiceName();
void doService();
Run Code Online (Sandbox Code Playgroud)
}
此接口的2个实现(MyServiceBean和MyAlternativeServiceBean)
而且,据我所知阅读球衣文件,我定义了一个hk2 Binder:
public class MyBinder implements Binder{
@Override
public void bind(DynamicConfiguration config) {
DescriptorImpl descriptor = BuilderHelper.link(MyServiceBean.class).named("MyServiceBean").to(MyService.class).build();
config.bind(descriptor);
config.bind(BuilderHelper.link(MyAlternativeServiceBean.class).named("MyAlternativeServiceBean").to(MyService.class).build());
}
Run Code Online (Sandbox Code Playgroud)
我将此绑定程序注册到ApplicationConfig类
public class ApplicationConfig extends ResourceConfig{
public ApplicationConfig(){
property("property.value", "MyAlternativeServiceImplementation");
registerInstances(new MyBinder());
}
Run Code Online (Sandbox Code Playgroud)
}
并正确注释到资源中
@Path("first")
public class First {
@Inject @Named(value = "MyServiceBean")
private MyService myService;
//...
}
@Path("second")
public class Second {
@Inject @Named(value = "MyAlternativeServiceBean")
private MyService myService;
//...
}
Run Code Online (Sandbox Code Playgroud)
一直有效,直到MyService实现没有args构造函数.但在一种情况下,我还需要为MyAlternativeServiceBean提供依赖.
这是构造函数
@Inject @Named("property.value") …Run Code Online (Sandbox Code Playgroud)