如何在Jersey 2.x中将对象注入Context中

时间:2015-10-11 05:33:11

标签: java neo4j jax-rs jersey-2.0

我试图注入提供者并使用@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来获取注入对象,我该如何在这里修改代码?

1 个答案:

答案 0 :(得分:0)

如果您正在为Neo4j撰写unmanaged extensionquestion 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() {
    }
}