将@ApplicationScoped更改为@SessionScoped时,Neo4J CDI静默失败

时间:2014-01-13 14:30:32

标签: java-ee neo4j cdi

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

更令人费解的是,在postCosntructor中调用时添加节点的相同调用在从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没有添加任何节点!

任何人都知道为什么?因为我不能将这个类保持为ApplicationScoped!

1 个答案:

答案 0 :(得分:0)

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