Dynamische Bean-Attribute -> Datenstrukturen ?

Hallo,

wer kann mir von den Profis ein paar Tips geben, wie ich „dynamische Beans“ erzeugen kann. Normalerweise würde man ja ein (Daten-)Objekt als Bean(entweder „normales“ Bean oder auch CMP-BEan etc…)modellieren. z.B. ein Kunde.

Mein problem ist nun, dass ich eine Anwendung habe, bei der ein Kunde nicht statisch ist mit seinen Properties/Attributen sondern er sich selbst eigene dazufügen kann. z.B. Hobbies, Interessen, Beruf, Geburtsort usw. Die eben nicht typisch für jedes BEan sind. Jeder ist damit „individuell“ und sollte selbst die Attribute dazufügen und löschen können.
(Es gibt zwar reflection-api mit der man OBjekte „auslesen“ kann aber umgekerht doch keine Möglichkeit objekt in dem Sinne mit richtigen Properties/Attribute und getter und setter Methoden dynamisch zu erzeugen, Oder?? (das ist meine erst Frage:smile:

Und nun die zweite:
Wenn nicht, wie modelliert man dann so eine Datenstruktur? MEin Idealszenario ist eine Bean, aber das geht wohl nicht. Wie würde man das sonst machen, durch eine Bean die lediglich eine Hashtable „attributes“ hat in der ich dann beliebig vom Nutzer Werte speichern kann?
wie z.B.: attributes.put(„hobbies“,„xyz“); attributes.put(„interessen“,„abc“); Ein Zugriff würde dann wohl per Getter/Setter Methoden direkt auf das Key erfolgen und mit damit den „Objekt-WErt zurückliefern“

Auch wenns vielleicht eine ganz doofe Frage ist, wie komme ich denn dann an den Datentyp ran, wenn ich einmal ein DAteobjekt und ein anderesmal ein Integer und String speichere. Ich muss das ja in den Zieltyp casten, woher weiss ich aber, welcher Objekttyp das ist? Irgendwas war da mit „instanceOf“, was ich jetzt aber gerade gesucht habe und nicht mehr gefunden habe.

Bin sehr dankbar für Tips wie man das Problem bestmöglich lösen kann bzw. ob es da irgendwelche Designpatterns oder Best-Practices gibt.

Vielen Dank!!
Julian

Hallo Julian

wer kann mir von den Profis ein paar Tips geben, wie ich
„dynamische Beans“ erzeugen kann. Normalerweise würde man ja
ein (Daten-)Objekt als Bean(entweder „normales“ Bean oder auch
CMP-BEan etc…)modellieren. z.B. ein Kunde.

Das hängt von Deinem Anwendungsfall ab:

  1. Willst Du Deine Anwendung auf einem Applicationserver laufen lassen?
  2. Willst Du eine Client-Application erstellen?
  3. Sollen die Daten persistent gemacht werden?
  4. Wenn ja: Wie? In eine Datenbank oder per serilization in ein Filesystem?

Mein problem ist nun, dass ich eine Anwendung habe, bei der
ein Kunde nicht statisch ist mit seinen Properties/Attributen
sondern er sich selbst eigene dazufügen kann. z.B. Hobbies,
Interessen, Beruf, Geburtsort usw. Die eben nicht typisch für
jedes BEan sind. Jeder ist damit „individuell“ und sollte
selbst die Attribute dazufügen und löschen können.

(Es gibt zwar reflection-api mit der man OBjekte „auslesen“
kann aber umgekerht doch keine Möglichkeit objekt in dem Sinne
mit richtigen Properties/Attribute und getter und setter
Methoden dynamisch zu erzeugen, Oder?? (das ist meine erst
Frage:smile:

Das kann man mit refelction bestimmt machen - scheint mir aber ein wenig umständlich. Wenn das ganze innerhalbe eines Enterprise JavaBean laufen soll, darfst Du kein reflection verwenden.

Und nun die zweite:
Wenn nicht, wie modelliert man dann so eine Datenstruktur?
MEin Idealszenario ist eine Bean, aber das geht wohl nicht.
Wie würde man das sonst machen, durch eine Bean die lediglich
eine Hashtable „attributes“ hat in der ich dann beliebig vom
Nutzer Werte speichern kann?
wie z.B.: attributes.put(„hobbies“,„xyz“);
attributes.put(„interessen“,„abc“); Ein Zugriff würde dann
wohl per Getter/Setter Methoden direkt auf das Key erfolgen
und mit damit den „Objekt-WErt zurückliefern“

Mein Tip an dieser Stelle wäre XML (mir gefällt die API www.jdom.org) als Datenstruktur. In XML kannst du dynamisch Elemente/Attribute hinzufügen und entfernen und strukturieren.
Mit einem XPath-Ausdruck kannst z.B. die Daten wieder komfortabel heraus holen.

Auch wenns vielleicht eine ganz doofe Frage ist, wie komme ich
denn dann an den Datentyp ran, wenn ich einmal ein DAteobjekt
und ein anderesmal ein Integer und String speichere. Ich muss
das ja in den Zieltyp casten, woher weiss ich aber, welcher
Objekttyp das ist? Irgendwas war da mit „instanceOf“, was ich
jetzt aber gerade gesucht habe und nicht mehr gefunden habe.

Beispiel:

if(obj instanceof String){
 System.out.println("Objekt ist ein String : "+((String)obj).toUpperCase());
}
else if(obj instanceof List){
 List l = (List) obj;
 for(Iterator it=l.iterator();it.hasNext():wink:{
 ...
 }
}
usw.

Bin sehr dankbar für Tips wie man das Problem bestmöglich
lösen kann bzw. ob es da irgendwelche Designpatterns oder
Best-Practices gibt.

Ich hoffe das Dir das weitergeholfen hat.

Gruß Christian

Wie würde man das sonst machen, durch eine Bean die lediglich
eine Hashtable „attributes“ hat in der ich dann beliebig vom
Nutzer Werte speichern kann?
wie z.B.: attributes.put(„hobbies“,„xyz“);
und mit damit den „Objekt-WErt zurückliefern“

Genau so. In der DynaActionForm von Struts ist das z.B. mit
einer HashMap realisiert.

und ein anderesmal ein Integer und String speichere. Ich muss
das ja in den Zieltyp casten, woher weiss ich aber, welcher
Objekttyp das ist? Irgendwas war da mit „instanceOf“, was ich

Kann denn der Benutzer angeben mit welchem Typ er das gespeichert
haben will?
Ansonsten kannst du doch dynamische Werte immer als String speichern.
Selbst wenn der Benutzer Ziffern eingibt.
Ich nehme jetzt mal an, dass die Werte nur zur Anzeige gebracht
werden muessen.

Gruss, Patrick