当前位置: 首页 > 面试题库 >

如何通过Neo4j非托管扩展中的@Context提供服务

尉迟高澹
2023-03-14
问题内容

我有Neo4j非托管扩展。我希望将某些服务创建为单例并通过@Context我的资源提供。

像这样:

@Path("/example")
public class ExampleResource {

    public ExampleResource(@Context CostlyService costlyService) { // <<---
        // use it here
    }
}

如何做到这一点?


问题答案:

Neo4j具有PluginLifecycle接口,这使我们有可能进入Neo4j服务器生命周期,并为注入博客文章提供我们自己的服务。

因此,我们有服务。让我们以这个为例:

public interface CostlyService {
}

public class CostlyServiceImpl implements CostlyService {

    public CostlyService() {
        // a LOT of work done here
    }

    //...
}

现在,我们需要进行自己的PluginLifecycle实现:

public class ExamplePluginLifecycle implements PluginLifecycle {

    @Override
    public Collection<Injectable<?>> start(GraphDatabaseService graphDatabaseService,
                                           Configuration config) {
        final List<Injectable<?>> injectables = new ArrayList<>();
        return injectables;
    }

    @Override
    public void stop() {
    }
}

如您所见,可注射列表目前为空。我们将很快在那里添加我们的服务。

重要提示: 您必须注册您的PluginLifecycle实现,因此可以通过SPI使用:

// file: META-INF/services/org.neo4j.server.plugins.PluginLifecycle
my.company.extension.ExamplePluginLifecycle

这将使PluginLifecycleNeo4j服务器可以发现您。

现在我们需要创建实际的注射剂。让我们为Injectable接口编写实现:

public final class TypedInjectable<T> implements Injectable<T> {

    private final T value;
    private final Class<T> type;

    private TypedInjectable(final T value, final Class<T> type) {
        this.value = value;
        this.type = type;
    }

    public static <T> TypedInjectable<T> injectable(final T value, final Class<T> type) {
        return new TypedInjectable<>(value, type);
    }

    @Override
    public T getValue() {
        return value;
    }

    @Override
    public Class<T> getType() {
        return type;
    }
}

这将作为我们服务的简单容器。用法:

import static my.company.extension.TypedInjectable.injectable;

injectable(new CostlyServiceImpl(), CostlyService.class);

现在,我们可以将注射剂添加到中了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;
}

更改之后,我们的CostlyService将通过@Context用于我们的资源:

@Path("/example")
public class ExampleResource {

    public ExampleResource(@Context CostlyService costlyService) {
        // use it here
    }

    // ...
}

提示 :将PluginLifecycle与资源一起放在同一包或子包中。



 类似资料:
  • 问题内容: 我对项目有一些特定要求,因此决定实施不受管理的Neo4j扩展。 我在Neo4j文档中找到了以下信息: 非托管扩展 测试您的扩展 这看起来是一个好的开始。但是我无法为我工作。 是否有一些更完整的工作示例/模板可以用作参考? 问题答案: “手工”解决方案 TL; DR; - https://github.com/FylmTM/neo4j-unmanaged-extension- templ

  • 我的neo4j服务器有一个非托管扩展。 代码如下。 当我部署代码时,我得到了500个内部错误。如果我删除代码 Result result = database.execute( “MATCH (n:KISI) where id(n)=1 return n” ); 然后一切都很好。 我检查了日志文件,错误如下 2015年8月13日3:34:36AM com . sun . jersey . SPI

  • 我部署了一个Neo4j非托管扩展。可以使用REST客户端调用非托管扩展并成功返回结果。问题是,当我尝试从另一个java类调用/调用非托管扩展时,它会继续抛出未经授权的401。 我使用Spring RestTemboard来调用非托管扩展。 我的代码: 完全错误:

  • 在尝试将spring和jersey集成到我的spring-data-neo4j非托管服务器插件中时,我有点不知所措。我已经创建了带有neo4j注释的POJO模型,以便在商店中持久化。除此之外,我还为数据操作创建了spring-data-neo4j存储库。我创建了一个springContext。xml文件并将其放在resources文件夹下。 此外,我已经设置了Spring显示器初始化器并初始化了S

  • 目录 10.1. 服务器插件 10.2. 非托管扩展 Neo4j服务器可以通过插件或者非托管扩展来增强。为了获取更多关于服务器的信息,请参考:第 17 章 Neo4j服务器。 10.1. 服务器插件 内容提示 - 服务器的功能可以通过增加插件的方式来增强。 - 插件是用户自己编码完成的,以便增强数据库,节点以及属性的功能。 - Neo4j服务器在与客户端通过HTTP方式进行交互时使用这些自定义插件

  • 问题内容: 很抱歉这个新手问题。node.js可以在任何托管提供商(如Fastdomain)中运行吗?我们在fastdomain中有一个帐户,我们在其中上传了用PHP制作的网站。我在主机中允许使用SSH,并尝试安装node.js,但无法正常工作。我一直在搜索互联网,但对此没有确切答案。 问题答案: 不,您不能在每个托管服务提供商上运行Node.js。您需要某些基本功能。如果您的托管服务提供商不像H