我试图注入提供者并使用@Context
来使用neo4j和Jersey 2.x中的对象。现在,我通过自定义注释实现它,例如:
@NameBinding
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER,ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface BaseInject {}
和提供者:
@Singleton
public class BaseExecutorResolver implements InjectionResolver<BaseInject> {
private Database database;
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> serviceHandle) {
if (Database.class == injectee.getRequiredType()) {
database = Neo4jContainer.neo4jServer.getDatabase();
return database;
}
return null;
}
@Override
public boolean isConstructorParameterIndicator() {
return false;
}
@Override
public boolean isMethodParameterIndicator() {
return true;
}
}
绑定代码如下:
bind(BaseExecutorResolver.class).to(new TypeLiteral<InjectionResolver<BaseInject>>() {
}).in(Singleton.class);
在资源类中,我可以使用@BaseInject Database db
来获取注入对象。
但是如果我想通过使用@Context
来获取注入对象,我该如何在这里修改代码?
答案 0 :(得分:0)
如果您正在为Neo4j撰写unmanaged extension,question and answer如何通过@Context在Neo4j非托管扩展中提供您的服务&#34;。
Neo4j有PluginLifecycle
。您可以实现自己的,并在那里提供injectables
。
代码示例:
public class ExamplePluginLifecycle implements PluginLifecycle {
@Override
public Collection<Injectable<?>> start(GraphDatabaseService graphDatabaseService,
Configuration config) {
final List<Injectable<?>> injectables = new ArrayList<>();
injectables.add(injectable(new CostlyServiceImpl, CostlyService.class)); // <---
return injectables;
}
@Override
public void stop() {
}
}