[英]Neo4J CDI silent failure when changing @ApplicationScoped into @SessionScoped
我將Beans遷移到CDI,並且遇到了Neo4j的奇怪行為,該行為不會持久化節點(但正確完成了事務),沒有任何錯誤的跡象。
更令人困惑的是,在postCosntructor內部調用時,添加節點的同一調用有效,而在REST服務中調用時無效! (從另一個未顯示的RestService類中調用g())
@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!
從SessionScoped bean中刪除構造函數將解決此問題。 使用現有代碼,每次創建新會話時都在創建一個新數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.