2012-04-11 15 views
4

Ich arbeite an einem EJB 3 Projekt mit OpenEJB (TomEE ++).Welche InitialContextFactory soll ich verwenden?

Ich habe eine Stateless-Session-Bean, deren Name mit einer Anmerkung angegeben wurde.

@Stateless(mappedName="SlideService", name="SlideService") 
public class SlideService { 

    public Map<Category, List<SlideShow>> fetchSlideShowsByCategory() { 
     Application app = Application.getInstance(); 
     return app.retreiveAllSlideShowsByCategory(); 
    } 

    public SlideShow fetchSlideShow(long id) { 
     return null; 
    } 

    public List<SlideShow> fetchSlideShowsByTitle(String title) { 
     return null; 
    } 

} 

Ich suche die Session-Bean aus meiner Struts Action-Klasse, wie folgt.

Properties properties = new Properties(); 
properties.setProperty Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory"); 
InitialContext initialContext = new InitialContext(properties); 
SlideService slideService = (SlideService)initialContext.lookup("SlideServiceLocalBean"); 

In dem obigen Code werden Sie feststellen, dass ich den Namen ‚SlideServiceLocalBean‘ zu verwenden, haben die Bohne zu finden, während ich ‚SlideService‘ explizit angegeben haben, in der Annotation Bean.

Wenn ich jedoch versuche, die Bean in meinem Testfall zu finden, muss ich noch eine andere Namenszeichenfolge verwenden.

EJBContainer ejbContainer = EJBContainer.createEJBContainer(); 
Object oSlideService = ejbContainer.getContext().lookup("java:global/slides/SlideService"); 

Warum gibt es eine Diskrepanz in Lookup-Namen?

Erhalte ich den InitialContext auf die richtige Weise in der Struts-Action-Klasse, oder sollte ich einen anderen Mechanismus/contextFactory verwenden, um den ursprünglichen Kontext zu erhalten?

Kann die Bean in die Action-Klasse injiziert werden, ohne eine externe DI-Bibliothek zu verwenden?

Antwort

2

Versuchen Sie dies in Ihrem Streben Action-Klasse:

new InitialContext().lookup("java:global/slides/SlideService"); 

Es sollte gut funktionieren. So sollten diese aus dem Inneren der Action-Klasse:

new InitialContext().lookup("java:module/SlideService"); 

Das Nachschlagen mit dem LocalInitialContextFactory früher JavaEE 6 Globale JNDI, wo diese java:global und java:module Namen kommen.

Dieses Dokument erklärt, wie es funktioniert.

Name Ihre Bean ist SlideService und hat, was eine @LocalBean Ansicht aufgerufen wird (eine einzelne Bohne viele Ansichten wie @LocalBean, @Remote, @Local haben kann), so der Name für Nachschlagen des SlideService als @LocalBean endet als SlideServiceLocalBean

Das ist nur das Standardformat. Sie können es in der Datei conf/system.properties beliebig ändern.

+0

Nit sicher, warum, aber wenn ich die erste Option versuche, bekomme ich eine Ausnahme "SEVERE: Servlet.service() für Servlet [Aktion] im Zusammenhang mit Pfad [/ Folien] warf Ausnahme [javax.naming.NameNotFoundException: Name Dias ist in diesem Kontext nicht gebunden] mit der Ursache javax.naming.NameNotFoundException: Name Folien ist nicht in diesem Kontext gebunden " – Parag

+0

Die zweite Option hat gut funktioniert. – Parag