Was macht die @ EJBs Annotation?
Ich weiß ungefähr, was diese Konstruktion bedeutet: es wird ein SomeType EJB und fügt das Objekt in eine andere EJB.
@EJB(name="name1")
SomeType someVariable
Nun habe ich eine Klasse, die beginnt so: (ich gebe alle Klassen-level-Anmerkungen, obwohl ich denke, dass nur die @EJBs
relevant ist)
@Remote(SomeClass.class)
@Stateless(name="someName")
@EJBs({@EJB(name="name1",beanInterface=Type1.class),
@EJB(name="name2",beanInterface=Type2.class)})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class X extends Y{
//code
Was machen die @EJB
s hier tun? Sie wahrscheinlich bekommen, oder erstellen Sie den "name1" ... Objekte von JNDI, aber wo tun Sie das Ergebnis? Ich sehe nicht ein .lookup
nennen, irgendwo in der Nähe, aber die Codebasis ist riesig, also bin ich nicht ganz sicher.
Bonus-Frage: ich nehme an, die beiden @Transaction
Anmerkungen wiederholen Sie einfach defaults?
UPDATE: Mehrere Personen behauptet an dieser Stelle, dass @EJBs
ist eine proprietäre Erweiterung. Es ist nicht. Es ist ein zentraler Teil der java EE5. Sehen die JavaDoc für details.. Es ist einfach ein container für die einzelnen @EJB
Anmerkungen.
Ich glaube, jeder, der behauptet, dass diese EJB-Annotationen tun, eine Suche. Ich möchte nur wissen, was passiert mit dem Ergebnis dieser Suche.
InformationsquelleAutor der Frage hyperman | 2012-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
@EJB
annotation (und@Resource
@WebServiceRef
usw.) dient zwei Zwecken:@EJB(name="myEJB")
erstellt einen Verweisjava:comp/env/myEJB
. Wenn Sie Anmerkungen ein Feld und geben Sie keinen Namen, dann wird eine Referenzjava:comp/env/com.example.MyClass/myField
.Wie sich der Bezug gelöst ist unterschiedlich, unabhängig davon, ob die Referenz aufgelöst wird, für eine
lookup("java:comp/env/myEJB")
oder durch Injektion:lookup
Attribut erfordert eine JNDI-Suche durch, um das Ziel auflösen.mappedName
der angegeben wird, werden Hersteller-spezifisch. Dies ist in der Regel umgesetzt, indem Sie eine Suche.beanInterface
oder die Art des Feldes) ist nur umgesetzt werden, indem eine einzelne EJB in der Anwendung, dann die EJB-Spezifikation erfordert, dass es wieder fallen.java:comp/env/myEJB
führen könnte, die eine SuchemyEJB
im server-namespace).InformationsquelleAutor der Antwort Brett Kail
Miljen Mikic Antwort gab Sie mir eine Idee über die mögliche Antwort. Wenn wer weiß, über JNDI dies liest, bitte sagen Sie mir, ob dies vernünftige, wie ich bin grundsätzlich raten hier.
Grundsätzlich gibt es 2 Methoden, sich in der JNDI-Struktur: entweder über einen globalen Pfad (/einige/proprietäre/path/my/Bohne) und über Ihre Programm-Umgebung (java:comp/env/my/Bohne). Die Idee ist, dass Sie erstellen-Referenzen aus den globalen Pfad zu deiner lokalen Umgebung, und dann Suche die Komponenten von dort.
Also @Ejb(name="java:comp/env/my/bean",mappedName="/einige/proprietäre/path/my/bean") schaffen würde, diesen Verweis aus java-code (ohne Deskriptor-xml-Datei).
Bedeutet dies, @Ejb(name="java:comp/env/my/bean") ist auf seine eigene, eine no-op: Es kopiert eine Referenz auf sich selbst. Es könnte hava als Nebeneffekt der Tatsache, dass Sie application server kennt nun auch zur compile-Zeit, dass dieser Verweis ist erforderlich,aber das ist über es.
InformationsquelleAutor der Antwort hyperman
Gemäß dieser linkim Grunde ist diese annotation ermöglicht die EJB-lookup externe EJBs relativ zu seinem Kontext. In der Regel gibt es elegantere Möglichkeiten, das zu tun.
InformationsquelleAutor der Antwort Miljen Mikic
Als für die bonus-Frage: ja, die zwei Anmerkungen in Bezug auf Transaktionen, die sich wiederholen, defaults: Die Standardeinstellung TransactionManagementType CONTAINER (vs BEAN) und der - default - TransactionAttributeType BEDARF einfach besagt, dass wenn die bean aufgerufen wird, die in einem transaktionalen Kontext die Transaktion wird fortgesetzt, andernfalls wird eine neue Transaktion eingeleitet werden (im Gegensatz zu, zum Beispiel REQUIRES_NEW, die immer einen neuen tx). Das ist im detail nicht so trivial, wie es klingt Vgl. die EJB 3.1 Spezifikation:
"13.3.7 Spezifikation der Transaktion Attribute einer Bean s Methoden
Dem Bean-Provider von einer enterprise-bean mit container-managed transaction demarcation angeben kann
die Transaktion Attribute für die enterprise-bean-Methoden. Standardmäßig ist der Wert der Transaktion
Attribut für eine Methode einer bean mit container-managed transaction demarcation ERFORDERLICH ist
transaction-Attribut, und das transaction-Attribut muss nicht explizit angegeben werden in diesem Fall.[...]"
InformationsquelleAutor der Antwort William Adams