Sonntag, Juni 7, 2020

@EJB injizieren von verschiedenen jar

Ich versuche zu injizieren, eine Bohne befindet sich in einem anderen jar-file, dann die Bohnen, den ich versuche zu injizieren es in. Beide Bohnen sind nur grundlegende @Stateless beans mit local-und remote-interfaces.
Wenn ich mit der normalen Injektion

@EJB
IBean injectedBean;

oder

@EJB
IBeanLocal injectedBean;

bekomme ich eine NullPointerException beim bereitstellen der Anwendung.

Wenn ich:

@EJB(mappedName="Bean")
IBean injectedBean;

oder

@EJB(mappedName="Bean")
IBeanLocal injectedBean;

alles funktioniert und JBoss wirft keine deployment-Fehler.

Könnte ich erwähnen, ich benutze JBoss 5.

Die bean-Klasse, ich bin Injektion ist deklariert als:

@Remote
public interface IBean

@Local
public interface IBeanLocal extends IBean

@Stateless(name = "Bean")
public class Bean implements IBean, IBeanLocal

Mein problem ist, dass, wie angegeben, in der Dokumentation der mappedName Eigenschaft ist Hersteller-spezifisch. Gibt es eine andere Möglichkeit könnte ich diese zu arbeiten?

GELÖST:

Habe ich es geschafft das problem zu lösen.

Das problem war, dass ich versuchte, für die Bereitstellung von Gläsern individuell, was bedeutete, dass jeder würde es bekommen, eigene ClassLoader in der JBoss so, dass Sie nicht zueinander finden und zurückkehren würde eine NullPointerException, wenn Sie versuchen zu injizieren die Bohne.

Die sollution war es, Stell die Gläser auf ein Ohr, und fügen Sie ein META-INF mit einer application.xml sah aus wie dieser:

<application xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"
         version="1.4">

  <display-name>Simple example of application</display-name>

  <module>
    <ejb>ejb1.jar</ejb>
  </module>
  <module>
    <ejb>ejb2.jar</ejb>
  </module>
</application>

Hatte ich auch einige JNDI-lookups ich passend zu der neuen Struktur, indem die ear-Namen vor dem Unterricht: „Ohren-name/Bohne“

Danach habe ich nur Hinzugefügt, die Gläser auf dem Ohr und alles, was bereitgestellt, schön.

  • Ihre application.xml root-Erklärung ist jedoch falsch. Sollten Sie mit Hilfe eines Java-EE-5-kompatibel, statt eines J2EE-1.4 ein.
  • Danke für den Hinweis. Hier ist ein Beispiel application.xml für Java EE 5 und 6: javahowto.blogspot.com/2009/10/…
  • Können Sie ein Beispiel-code auf Ihrem „Ohr-name/Bohne“ ?
InformationsquelleAutor Alin Vulparu | 2011-11-18

2 Kommentare

  1. 1

    Müssen Sie deklarieren Sie die lokale Schnittstelle, um JBoss finden die Bohne basierend auf der Schnittstelle (nur angenommen, Sie sind mit EJB 3.0):

    @Stateless(name = "Bean")
    @Local ( IBeanLocal.class  )
    @Remote ( IBean.class )
    public class Bean implements IBean, IBeanLocal { ... }

    Edit: IBean ist eine remote-Schnittstelle (siehe Kommentar).

    • Sorry, ich vergaß zu erwähnen, IBean ist ein Remote-interface und IBeanLocal erstreckt IBean und ist eine Lokale Schnittstelle
  2. 0

    Versuchen, die Injektion Ihre Bohne mit @EJB(beanName = "Bean")

    Nicht sicher, ob es wird funktionieren, aber wir hatten ein ähnliches Problem und es wurde verursacht durch das fehlen der beanName Attribut.

Kostenlose Online-Tests