【问题标题】:How to inject object into Context in Jersey 2.x如何在 Jersey 2.x 中将对象注入 Context
【发布时间】:2015-10-11 05:33:10
【问题描述】:

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

【问题讨论】:

  • 对不起,我搞错了,InjectionResolver如下: public class BaseExecutorResolver implements InjectionResolver { private Database database; @Override public Object resolve(Injectee injectionee, ServiceHandle> serviceHandle) { if (Database.class== injectee.getRequiredType()) { database = Neo4jContainer.neo4jServer.getDatabase();返回数据库; } 返回空值; } }
  • 你想要的是Factory,如here所示
  • 非常感谢,这正是我想要的

标签: java neo4j jax-rs jersey-2.0


【解决方案1】:

如果您正在为 Neo4j 写 unmanaged extension,这里是 question and answer,关于如何“在 Neo4j 非托管扩展中通过 @Context 提供您的服务”。

快速大纲

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() {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多