Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 将@ApplicationScoped更改为@SessionScoped时Neo4J CDI静默故障_Jakarta Ee_Neo4j_Cdi - Fatal编程技术网

Jakarta ee 将@ApplicationScoped更改为@SessionScoped时Neo4J CDI静默故障

Jakarta ee 将@ApplicationScoped更改为@SessionScoped时Neo4J CDI静默故障,jakarta-ee,neo4j,cdi,Jakarta Ee,Neo4j,Cdi,我将我的bean迁移到CDI,我遇到了Neo4j的一个奇怪行为,它没有持久化节点,但正确地完成了事务,没有任何错误迹象 更令人困惑的是,添加节点的同一个调用在Postconstructor内部调用时有效,但在REST服务中调用时无效!g是从另一个未显示的RestService类调用的 @Named @SessionScoped public class MyNeo4JController implements Serializable { @Inject private Neo4JG

我将我的bean迁移到CDI,我遇到了Neo4j的一个奇怪行为,它没有持久化节点,但正确地完成了事务,没有任何错误迹象

更令人困惑的是,添加节点的同一个调用在Postconstructor内部调用时有效,但在REST服务中调用时无效!g是从另一个未显示的RestService类调用的

@Named
@SessionScoped
public class MyNeo4JController implements Serializable
{
   @Inject
   private Neo4JGraph neo4jGraph;
   public MyNeo4JController()
   {
     if (neo4jGraph == null)
        {
            neo4jGraph = new Neo4JGraph();
        }
   }

   @PostConstruct
   void postConstruct()
   {
        f();
   }

   public void f()
   {
     getGraphStorage().addNode("F");
   }

   public void g()
   {
     getGraphStorage().addNode("G");
   }
}

@Singleton
public class Neo4JGraph
{
    private static final String FILESYSTEM_DB = "target/neo4j-db";
    private GraphDatabaseService graphDb;
    public void addNode(String name)
    {
        Transaction tx = graphDb.beginTx();
        try
        {
            Node newNode = graphDb.createNode();
            newNode.setProperty("name", name);
            tx.success();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            tx.failure();
        }
        finally
        {
            tx.finish();
        }
        return true;
    }

    public void setUp(String rootUuid)
    {
        if (graphDb == null)
        {
            graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(FILESYSTEM_DB);
            indexManager = graphDb.index();
            index = indexManager.forNodes("indexNodes");
            registerShutdownHook();
            setGraphRootUUIDString(rootUuid);
        }
    }
}
CDI和neo4J之间是否存在某种神秘的不兼容,或者我是否遗漏了什么

编辑:好的,显然我缩小了错误范围,将MyNeo4JController中的@SessionScoped更改为@ApplicationScoped,现在节点被持久化了。 请注意,在这两种情况下均未返回错误,但在SessionScoped中未添加任何节点


有人知道为什么吗?因为我不能将这个类作为应用程序处理

从SessionScoped bean中删除构造函数将解决这个问题。使用现有代码,每次创建新会话时都要创建一个新数据库。

我实际上是在使用同一个数据库创建一个新的数据库对象,该数据库具有文件系统\u DB=target/neo4j DB;如果我从bean中删除构造函数,数据库是如何初始化的?GraphDataBaseService实例是数据库服务器实例本身,而不仅仅是会话或连接。如果您以嵌入式方式使用它,那么您必须在应用程序中将其作为一个单例,并在应用程序停止时强制执行适当的关闭-最好的方法是在PostConstruct方法中创建GraphDataBaseService实例,并在ApplicationScoped bean的PreDestroy方法中关闭它,然后返回实例到其他bean RequestScoped、SessionScoped等客户端,无需任何进一步的魔法。它们需要适当地执行事务。