Jakarta ee 将@ApplicationScoped更改为@SessionScoped时Neo4J CDI静默故障
我将我的bean迁移到CDI,我遇到了Neo4j的一个奇怪行为,它没有持久化节点,但正确地完成了事务,没有任何错误迹象 更令人困惑的是,添加节点的同一个调用在Postconstructor内部调用时有效,但在REST服务中调用时无效!g是从另一个未显示的RestService类调用的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
@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等客户端,无需任何进一步的魔法。它们需要适当地执行事务。