| 

.NET C# Java Javascript Exception

2
Hi zusammen, etwas aus meiner Arbeit das mir gerade Kopfzerbrechen bereitet.

Ich will Parameter aus einer Datenbank lesen für eine Applikation. Aktuell machen wir hier das Mapping wie der Parameter in der Datenbank lautet über eine Konstantenliste in einer Klasse und einer init() Methode in der wir der Eigenschaft der Klasse den Parameter manuell zuweisen.
Beispielcode:
class Test extends myClass {
private String testPfad = null;
private void init() {
testPfad = ParameterDB.getWert(Parameter.TESTPFAD); // TESTPFAD ist in der Konstantenliste (keine Enums) und hat den Name test.testAusgabePfad mit Wert c:\temp\
}
}


Wie man sieht ist das nicht so schön gelöst wie ich finde, der Teil ist aber auch schon sehr alt und aus den Anfängen der Applikation als es noch auf Java 1.4 lief - eine gute Lösung für damals, aber nicht für heute.

Idee wäre nun einfach das ganze abzuändern und mit Annotations zu arbeiten:
class myClass {
public void init() {
ParameterDB.setWerte(this);
}
}

class Test extends myClass {
@Parameter(name="test.testAusgabePfad")
private String testPfad = null;
// testPfad ist über die Elternklasse initialisiert und hat nun c:\test\ als Wert
}


Ich finde dazu nur nichts in den Standard Annotations, muss ich dazu eigene Annotations schreiben oder gibt es dafür doch schon etwas? Oder sogar noch eine bessere Lösung an die ich noch nicht gedacht habe? Das ein Deployment nötig ist macht nichts, immerhin geht es hier ja um Klaseneigenschaften.
News:
05.12.2014
Lord_Pinhead 778 8
Verstehe ich dich richtig, du willst eine Member-Variable die in der Kindklasse definiert ist durch die Eltern-Klasse initialisieren?
phg 05.12.2014
Ich würde die init-Methode in die implementierende Klasse verschieben und auf Annotations verzichten. Das Wörterbuch würde ich ebenfalls in der Datenbank halten (Parameter symbolisch, Parameterwert mit Primärschlüssel Parameter symbolisch). Ein init in der Elternklasse ist generell keine gute Idee, denn man müsste die aktuelle Klasse per Typinfos analysieren.
edvservice 08.12.2014
In Spring gäbe es dafür die @Value-Annotation.
Matthias Hlawatsch 09.12.2014
1 Antwort
0
Ja soweit stimmt es was Ihr verstanden habt. Ich hab einen Grundlegenden Test soweit gemacht, eine eigene Annotationsklasse geschrieben die aus der Datenbank die Parameter DATEN anhand des Namens aus dem Wörterbuch lädt, nun muss ich nur noch Zeit finden den Reflection Code zu schreiben der die Daten aus der Datenbank dann der Variable übergibt.

Das selbe ist eigentlich wie die Windows Registrierung: Ich kenne den "Pfad" in der Registry und lade mir die Variablen rein. Ich will es nur vereinfachen, überschreiben kann ich die init() Methode am Ende ja immernoch wenn ich mag.

@edvservice
Der Grundgedanke ist auch, das wir von den init() Methode aus der Implementierten Klasse weg kommen. Wenn ich immer wieder das selbe schreibe ist das einfach unnützer Boilerplate Code. An sich sagt ein Spring Entwickler wahrscheinlich "Ja das ist doch ein Aspekt" - und schon hat jede unserer Klassen einen Aspekt der die Daten lädt ohne das man etwas merkt. Aber der Umbau auf Spring ist noch in der Planphase für nächstes Jahr.

Dann noch folgende Überlegung:
Jede Klasse erbt den Logger. Wenn ich nun in jeder Unterklasse die Loglevel Variable hinterlegen muss, weil ich Debugging Ausgaben zur Laufzeit haben möchte für z.B. einen Quartz Job, dann wäre es sinnfrei in jeder Klasse die Variable dafür rein zu kopieren. Die Elternklasse hat den Loglevel als Member Variable, eine Erbende Klasse kann den nun zur Laufzeit für sich ändern und der Loglevel in der Ausgabe kann zur Laufzeit hochgesetzt werden ohne das wir die Applikation durchstarten müssen.

Das Wörterbuch in der DB ist aber eine gute Idee, das werden wir uns im nächsten Jahr gleich mal ansehen. Das lade ich dann einfach in den Cache und gut isses.
Am Ende wollen wir einfach nicht mehr wegen einem ändern eines Parameter Namens von z.B job.db.ressourcename auf job.db.databasename die komplette Applikation deployen. Das Wörterbuch in der DB, welches dann die Klasse mit den Konstanten ersetzt ist dann das i-Tüpfelchen.

Gruß Lord_Pinhead
11.12.2014
Lord_Pinhead 778 8

Stelle deine Java-Frage jetzt!