2016-09-24 2 views
1

J'ai un problème lors de l'implémentation de la solution neo4j Graphaware. Auparavant, je créais l'objet GraphDatabaseService comme suit -Initialiser d'autres variables de la variable @Context injectée

public class TimetreeUtil { 
    public static GraphDatabaseService db; 
    public static SingleTimeTree st; 
    public static TimeTreeBackedEvents ttbe; 
    public static TimeTreeBusinessLogic ttbl; 
    public static TimedEventsBusinessLogic tebl;  
    public static List<Event> eventsFetchedFromTimetree; 

    public TimetreeUtil() { 
     db = new GraphDatabaseFactory().newEmbeddedDatabase(new File("...")); 
     st = new SingleTimeTree(db); 
     ttbl = new TimeTreeBusinessLogic(db); 
     ttbe = new TimeTreeBackedEvents(st); 
     tebl = new TimedEventsBusinessLogic(db, ttbe); 
    } 
} 

Cela fonctionnait correctement. Comme vous pouvez le voir, GraphDatabaseService, SingleTimeTree, TimeTreeBackedEvents, TimeTreeBusinessLogic et TimedEventsBusinessLogic sont tous statiques et devraient l'être, car neo4j le demande.

Mais maintenant, notre architecture a changé et nous injectons la GraphDatabaseService par -

@Context 
public GraphDatabaseService db; 

Alors maintenant, regarde la classe comme -

public class TimetreeUtil { 
     @Context 
     public GraphDatabaseService db; 
     public static SingleTimeTree st; 
     public static TimeTreeBackedEvents ttbe; 
     public static TimeTreeBusinessLogic ttbl; 
     public static TimedEventsBusinessLogic tebl;  
     public static List<Event> eventsFetchedFromTimetree; 

     public TimetreeUtil() { 
      st = new SingleTimeTree(db); 
      ttbl = new TimeTreeBusinessLogic(db); 
      ttbe = new TimeTreeBackedEvents(st); 
      tebl = new TimedEventsBusinessLogic(db, ttbe); 
     } 
    } 

La classe aide Timetree est simplement la création d'un objet de la la classe TimetreeUtil par TimetreeUtil util = new TimetreeUtil(); puis en appelant une méthode de TimetreeUtil.

Je suppose que, au moment où le constructeur est appelé, db aurait déjà été initialisé, mais ce n'est pas le cas. db est nulle et donc st = new SingleTimeTree(db); donne NPE.

Comment puis-je rencontrer les deux extrémités se rencontrent? Merci.

+0

db sera initialisé lorsque vous appelez la procédure, ce qui fait la le code appelant la procédure ressemble à? –

+0

Salut @ChristopheWillemsen, merci pour votre réponse! J'ai modifié mon message original pour montrer plus clairement ce qui se passe. Merci. –

Répondre

1

L'injection de dépendances s'exécute après la création de l'objet - Java doit créer l'objet avant que les variables d'instance d'objet puissent être définies, d'où le NPE.

Vous peut être en mesure de passer l'objet dans le constructeur (valeur test, mais je ne suis pas sûr qu'il fonctionnera):

private GraphDatabaseService db; 
    public static SingleTimeTree st; 
    public static TimeTreeBackedEvents ttbe; 
    public static TimeTreeBusinessLogic ttbl; 
    public static TimedEventsBusinessLogic tebl;  
    public static List<Event> eventsFetchedFromTimetree; 

    public TimetreeUtil(@Context GraphDatabaseService db) { 
     this.db = db 
     st = new SingleTimeTree(db); 
     ttbl = new TimeTreeBusinessLogic(db); 
     ttbe = new TimeTreeBackedEvents(st); 
     tebl = new TimedEventsBusinessLogic(db, ttbe); 
    } 
+0

Merci beaucoup! Je suis capable de résoudre ce problème. –