Struts 2.0 + EJB 3.0 - Τον ήπιαμε λίγο
Λοιπόν, έχουμε τα παρακάτω facts τα οποία δεν αλλάζουν
- Χρήση EJB3.0, γιατί αυτή είναι η δουλειά μας, γιατί έχουμε φάει την .τσα του 2.1, γιατί απο τις πρώτες υλοποιήσεις φαίνεται οτι δουλεύει, γαιτί θέλουμε τον container βλεπε JΒoss σε περιπτώσεις που το Spring δε μας καλύπτει.
- Χρήση Struts (1.2 ή 2), γιατί το ξέρουμε, δεν έχουμε αυτή τη στιγμή χρόνο να πάμε σε κάτι άλλο, γιατί γαμάει και δέρνει ως framework ιδιαίτερα το 2.ο, γιατί δε μας αρέσει το JSF, γιατί δεν έχουμε χρόνο να το κάνουμε σε JSF.
Με μεγάλη λύπη μπορώ να σας διαβεβαιώσω οτι αυτή τη στιγμή δηλαδή στο ξεκίνημα των Struts 2.0 και EJB3.0 τα πράγματα δεν είναι καλά! Το πρόβλημα είναι συγκεκριμένο φαντάζει μικρό αλλά είναι ΜΕΓΙΣΤΗΣ σημασίας.
Το web layer είναι μια χαρά οργανωμένο, αντίστοιχα και το business layer. είναι η στιγμή που θα τα ενώσεις. Για τους γνώστες να πουμε οτι συνήθως σε τέτοιες περιστάσεις απο το J2EE 1.4 θα πάρεις και θα υλοποιήσεις το πακετάκι απο pattern ServiceLocator / Delegates. Ο ServiceLocator είναι ενα singleton ο οποιος cacharei και βρίσκει EJB interfaces για σενα και σου τα πασάρει στο web layer για μη γράφει συνέχεια duplicated κωδικα ο οποίος θα κάνει JNDI lookups και interface narrowing +παράλληλα ο delegate είναι ακόμα ένας διαχωρισμός ο οποίος αποκτά σημασία στο να δώσει ακόμα έναν διαχωρισμό στην εύρεση του Businnes object per case.Ένα ατελείωτο layering. Και ήμασταν καλά!
Με την έλευση του EJB3 πολλά απο τα γνωστά interface, έχουν φύγει, για τον προγραμματιστή πράγματι η διαδικασία έχει απλοποιηθεί και το βάρος έχει πέσει στην πολύπλοκότητα του container (όπως έλεγε και ο Δημήτρης, για εσας j2ee developers τα πράγματα έχουν γινει ωραία, για εμας του container developers κόλαση).Μπορείς να φιάξεις εναν χαζό service locator ο οποίος βέβαια δε θα μπορεί efficiently να κάνει caching interfaces αλλά μόνο look up (ευχαριστω πολύ αυτό το κάνω και απο το action- κατουσιαν).
To EJB 3.0 σαν το Spring κάνει χρήση του Dependency Injection. Ιδιαίτερα σε web layer όπως απλά servlets αλλά και JSF το δέσιμο του web action class με το πραγματικό SLSB (Stateless Session bean) λύνεται εύκολα και γρήγορα με annotations και Dependency injection. Εσύ γράφεις ενα @EJB (name = κτλ και ο container σου κάνει inject το object που έχεις ορίσει. τι ωραια τι καλά!
Πάμε στο Struts 2.0 υποστηρίζει dependency Injection και μάλιστα το κάνει με ενα project της google Grucie. Υπάρχει υποστήριξη για Spring αλλά όχι EJB3.
Με άλλα λόγια είτε θα πρέπει να φιάξω δικα μου annotation και να υλοποιήσω εγώ το dependency injection στο Struts ,ειτε να βάλω μέσα το Spring για να μου κάνει αυτό το IoC, ειτε να ακολουθήσω τον δρόμο του κουτσου service locator, ειτε σαν χασάπης να κάνω κλησεις στο initial context απο τα Struts Action, ειτε να αλλάξω framework!
είμαι λίγο απογοητευμένος που το νέο struts δεν έχει υποστήριξη γιάυτο το κομμάτι. Θα ήθελα πάρα πολύ να είμαι ο πρώτος που θα το έκανα contribute (και οχι με work around) αλλά ο χρόνος είναι μηδενικός.Από την άλλη δε θέλω να αλλάξω framework γιατί το struts καλύπτεις τις ανάγκες του project
Ελπίζω να βγει κάποιο extention plugin .προς το παρον
1 Context c=new InitialContext();return(TestSessionLocal)c.lookup("java:comp/env/ejb/TestSessionBean");