Hi,
ich habe mein aktuelles Projekt endlich auf JPA umgestellt und die Grundlagen funktionieren schon ganz gut. Jetzt hab ich aber ein Problem mit den ganzen Injections, die ich deswegen scheinbar brauche.
Zum einen habe ich gelesen, dass zu viel Injection auch nicht gut ist, zum anderen habe ich das Problem, dass teilweise meine injecteten Objekte null sind.
Ich geb mal ein Beispiel, bin aber auch total kritik-offen, falls mein Ansatz blöd ist.
Wir haben viele Konfigurationsparameter in der Datenbank gespeichert. Diese möchte ich nicht ständig zur Laufzeit laden, sondern einmal zum Start des Servers, wenn jemand etwas in der Konfiguration geändert hat und prophylaktisch alle x Minuten, falls ich mal etwas direkt über die Datenbank ändere, das würde der Server ja dann garnicht mit bekommen.
Die Klasse sieht in etwa so aus:
Wenn ich das debugge, dann ist der confFiller immer null. Der sieht so aus:
Hier ist die Injectete Klasse rein für die DB-Verbindung zuständig. Aber so weit komme ich im Moment ja garnicht.
Die anderen Klassen, die ich für die Config verwende sind alle ähnlich aufgebaut, hier mal ein Beispiel:
Hier wurde mir bereits erklärt, dass das dbInterface immer null ist, weil ich die Klasse über ihren Konstruktor lade. Deswegen mein versuchter Ansatz mit dem Inject.
Irgendwie ist mir hier alles, was ich als Hilfe zu den Annotationen finde nicht Aussagekräftig genug, oder die Beispiele, die ich finde,, sind so weit von (meiner) Realität entfernt, dass ich es nicht anwenden kann.
Für Hilfe bin ich sehr dankbar.
ich habe mein aktuelles Projekt endlich auf JPA umgestellt und die Grundlagen funktionieren schon ganz gut. Jetzt hab ich aber ein Problem mit den ganzen Injections, die ich deswegen scheinbar brauche.
Zum einen habe ich gelesen, dass zu viel Injection auch nicht gut ist, zum anderen habe ich das Problem, dass teilweise meine injecteten Objekte null sind.
Ich geb mal ein Beispiel, bin aber auch total kritik-offen, falls mein Ansatz blöd ist.
Wir haben viele Konfigurationsparameter in der Datenbank gespeichert. Diese möchte ich nicht ständig zur Laufzeit laden, sondern einmal zum Start des Servers, wenn jemand etwas in der Konfiguration geändert hat und prophylaktisch alle x Minuten, falls ich mal etwas direkt über die Datenbank ändere, das würde der Server ja dann garnicht mit bekommen.
Die Klasse sieht in etwa so aus:
Java:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.DependsOn;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import main.java.atc.definitions.ReferenceSystem;
import main.java.configuration.States;
import main.java.configuration.cache.kvdb.KVDbConfigs;
@Startup
@Singleton
@DependsOn({"AtcConfiguration", "DatabaseCheck"})
public class ServerCache {
private static final Logger LOG = LogManager.getLogger(ServerCache.class);
private static ServerCache cache = new ServerCache();
private static Calendar lastScan = Calendar.getInstance();
private Map<ReferenceSystem, ReferenceSystemConfig> refSystemConfigs;
private SystemConfig sysConf;
private MailConfig mailConfig;
private UcmdbDashConfig ucmdbDashConfig;
@Inject
private RefSysConfFiller confFiller;
private States state;
public ServerCache() {
init();
}
@PostConstruct
public void init() {
state = States.BEFORESTARTED;
long start = System.currentTimeMillis();
try {
mailConfig = new MailConfig();
sysConf = new SystemConfig();
ucmdbDashConfig = new UcmdbDashConfig();
refSystemConfigs = confFiller.fillRefSystemConfig();
state = States.STARTED;
} catch(Exception e) {
LOG.fatal("Error loading Cachedata", e);
throw new RuntimeException("Error loading Cachedata", e);
}
long dauer = System.currentTimeMillis() - start;
LOG.debug("Cache reload Dauer = " + (dauer / 1000));
}
}
Code:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.inject.Model;
import javax.inject.Inject;
import main.java.atc.definitions.ReferenceSystem;
import main.java.persistence.entities.AtcParameter;
import main.java.persistence.interfaces.AtcParameterDbInterface;
@Model
public class RefSysConfFiller {
@Inject
private AtcParameterDbInterface atcParameterDbInterface;
public Map<ReferenceSystem, ReferenceSystemConfig> fillRefSystemConfig() {
Map<ReferenceSystem, ReferenceSystemConfig> refSystemConfigs = new HashMap<>();
for(ReferenceSystem r : ReferenceSystem.values()) {
List<AtcParameter> connectorParameter = atcParameterDbInterface.loadConnectorParameter(r);
Map<String, String> configMap = new HashMap<>();
for(AtcParameter par : connectorParameter) {
String parameter = par.getPk().getKEY4();
String value = par.getPARAMETER1();
configMap.put(parameter, value);
}
ReferenceSystemConfig conf = new ReferenceSystemConfig(configMap);
refSystemConfigs.put(r, conf);
}
return refSystemConfigs;
}
}
Die anderen Klassen, die ich für die Config verwende sind alle ähnlich aufgebaut, hier mal ein Beispiel:
Java:
public class AmeiseConfig {
private static final Logger LOG = LogManager.getLogger(AmeiseConfig.class);
private String mailRecipients;
private String ameiseJobs;
private Integer dayOfWeek;
@Inject
private AtcParameterDbInterface dbInterface;
public AmeiseConfig() {
List<AtcParameter> ameiseParameter = dbInterface.loadAmeiseParameterTable();
for (AtcParameter par: ameiseParameter) {
String key = par.getPk().getKEY3().toUpperCase();
String value = par.getPARAMETER1();
switch(key) {
case "RECIPIENTS":
this.mailRecipients = value;
break;
case "DAYOFWEEK":
try {
this.dayOfWeek = Integer.parseInt(value);
} catch (Exception e) {
LOG.info("Fehler beim Einlesen der Ameise Konfiguration, Mail-Versand deaktiviert.");
this.dayOfWeek = -1;
}
break;
default: //JOBS
this.ameiseJobs = value;
}
}
}
//Getter Block
}
Irgendwie ist mir hier alles, was ich als Hilfe zu den Annotationen finde nicht Aussagekräftig genug, oder die Beispiele, die ich finde,, sind so weit von (meiner) Realität entfernt, dass ich es nicht anwenden kann.
Für Hilfe bin ich sehr dankbar.