Hallo zusammen,
ich habe in den letzten Wochen Spring 3 gelernt und nun versuche ich eine Beispielprogramm zu schreiben.Dabei bin ich aber unsicher wie weit man DI benutzen soll.
Z.B. in meinem Programm habe ich Klasse Usergroup welches nur Rechte hat und sie im Konstruktor übergeben bekommt und Klasse User welches im Konstruktor Usergroup übergeben bekommt.
Die Rechte werden aus einer Datenbank beim anmelden gelesen. Also weiss das Programm von Rechten erstmal nichts.
Ist es nun besser ein Usergroup Objekt mit DI zu erzeugen und Rechte mit setter-Methoden setzen und das gleiche mit User, oder die Objekte doch mit new erzeugen und DI nur beim Objekten benutzen bei denen ich schon im voraus weiss was ich setzen muss?
Ich hoffe ich konnte mein Problem richtig beschreiben. Danke im Voraus für die Antworten.
Zudem bin ich mir nicht sicher ob du über "READ" und "WRITE" ein Objekt vom Typ "Right" injezieren kannst. Eigentlich wird Spring das als String interpretieren (ACHTUNG der String ist dann "WRITE" mit den ") und wird es auch wieder nicht injezieren können.
Danke für den Tipp.
Right ist ein enum und ohne Anführungsstriche war Spring auch in der Lage das zu setzen.
Nun habe ich eine letzte Frage:
Ich möchte z.B. beim erstellen von OrderService also im Konstruktor geguckt wird ob der User der diese Service nutzen wird auch die entsprechen Rechte hat. Wenn ich aber im Konstruktor etwas schreibe dann werden die Objekte nicht inijiziert.
Hast du vlt noch eine guter Tipp?
Ich nehme an, dass isPermited auf dem Set operiert?
Wenn ja, dann musst du im applicationContext (die XML Datei) anstelle von property mit constructor-arg arbeiten, dann injeziert Spring die Abhängigkeiten über den Konstruktor.
Also die XML Datei:
[XML]
<util:set id ="rights" set-class = "java.util.HashSet">
<value>READ</value>
<value>WRITE</value>
</util:set>
<bean id="service" abstract="true" class = "de.erpel.core.Service"/>
<bean id="orderService" class="de.erpel.core.OrderService">
<constructor-arg ref = "rights" />
</bean>
[/XML]
und die isPermitted():
Java:
publicbooleanisPermitted()throwsNotPermittedException{Iterator<Right> it;
it = requiredRights.iterator();while(it.hasNext()){boolean found =false;for(Right right : session.getUser().getRights()){if(it.next()== right)
found =true;break;}if(found ==false)return found;}returntrue;}
importjava.util.Set;publicclassOrderServiceextendsService{publicOrderService(Set<String> requiredRights){super(requiredRights);for(String right :getRequiredRights()){System.out.println(right);}}}
Du möchtest, also, ohne das du das in Java formulierst dafür sorgen, dass die Methode isPermitted automatisch von Spring aufgerufen wird?
Das geht dann aber weit über DI hinaus. Möglich ist das wohl über AspectJ bzw. Spring AOP. Oder aber über Spring Lifecycle Methoden (glaube zumindest das es die gibt).
Wenn du Methoden durch Spring absichern möchtest (z.B. Exception, wenn User die Rechte nicht hat, um den Service zu nutzen), solltest du dir Spring Security anschauen. Das deckt u.a. diese Belange ab.
Wenn du Methoden durch Spring absichern möchtest (z.B. Exception, wenn User die Rechte nicht hat, um den Service zu nutzen), solltest du dir Spring Security anschauen. Das deckt u.a. diese Belange ab.