Я знаю это беспокойство немного больше GWT ...
Я разрабатываю свое первое приложение CWT. И я использую RequestFactory. Я беру пример из "GWT In Action Second Edition". Внутри класса ContactService находятся методы доступа к базе данных, которые я хочу подключить к Neo4J Graph. В конструкторе я добавил это
private static GraphDatabaseService graphDB;
public ContactService () {
String DB_PATH = "/home/myName/Developer/Workspace/MyGWTApp/DATA";
graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
}
Я могу использовать CRUD, передав статическую переменную graphDB методу, fetch (graphDB, id), persist (graphDB, c) и т. Д. Все работает хорошо. Первый раз конструктор дает мне ссылку на график. Моя проблема в том, что когда я разрабатываю другой класс обслуживания на примере FriendService, мне снова нужно подключение к graphDB. Я не могу воссоздать то же самое с конструктором
private static GraphDatabaseService graphDB;
public FriendService () {
String DB_PATH = "/home/myName/Developer/Workspace/MyGWTApp/DATA";
graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
}
Это нормально с Neo4J. Я должен получить только значение моей статической переменной graphDB. Но как это сделать?
Я пытался создать такой сервлет
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
public class Neo4jServletContextListener implements ServletContextListener{
public static GraphDatabaseService getGraphDB(ServletContext context) {
return (GraphDatabaseService) context.getAttribute("neo4j");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
getGraphDB(arg0.getServletContext()).shutdown();
//System.out.println("ServletContextListener destroyed");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
String DB_PATH = "/home/myName/Developer/Workspace/MyGWTApp/DATA";
GraphDatabaseService graphDB =
new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
ServletContext context = arg0.getServletContext();
context.setAttribute ("neo4j", graphDB);
//System.out.println("ServletContextListener started");
}
}
Но сделать это невозможно
graphDB = (GraphDatabaseService) getServletContext().getAttribute("neo4j");
Я нашел где-то в Stack Overflow эту строку, которая работает хорошо
graphDB = (GraphDatabaseService) RequestFactoryServlet.getThreadLocalServletContext().getAttribute("neo4j");