2011-01-17 8 views
2

Ich bin neu in JSF, Filter und JPA und verwende NetBeans und Glassfish.Java Servlet Filter und Umfang anderer Objekte und Entity Manager

Ich habe ein JSF-Formular, das übermittelt und wiederum auf eine Objektmethode zugreift, die eine Facade-Objektmethode aufruft, um eine DB-Abfrage auszuführen. Die Fassade Klasse verwendet eine Anmerkung Zugang zum EntityManager zu erklären:

@PersistenceContext(unitName = "NAMEOFAPP") 
private EntityManager em; 

Wenn ich versuche, und rufen Sie die gleiche Fassade aus einer Filterklasse (vor oder nach chain.doFilter), die Fassade Klasse und EntityManager Arbeit, aber Wenn ich meine eigene Klasse in der Filterklasse instanziiere und eine Methode aufruft, die versucht, auf die Fassade zuzugreifen, wird sie nicht instanziiert, und ich bekomme eine Null-Ausnahme, wenn ich sie aufruft.

Also, wie bekomme ich meine Klasse Zugang zu einem Facade/EntityManager? Ich deklariere die Fassade auf die gleiche Weise wie in der Filterklasse.

Warum muss ich neu meine Klasse, wenn alle anderen bereits instanziiert sind?

Danke.

Antwort

2

Wenn Sie JavaEE 6 verwenden, können Sie es mit @Inject injizieren - CDI bietet diese Funktionalität.

Wenn nicht, müssten Sie über JNDI nachsehen.

Sie sollten keine Objekte instanziieren, die verwaltet werden sollen. Wenn Sie dies tun, erhalten sie nichts injiziert, einschließlich der Entity Manager.

+0

Dank Bozho. Ich habe die Klasse als ManagedBean deklariert, aber jetzt wirft Glassfish eine 500 mit: javax.naming.NameNotFoundException. Wie deklariere ich diese Bean so, dass sie beim Build abgeholt wird? – JPC

+0

glassfish welche version? – Bozho

+0

Ver 3.0.1, in faces-config.xml gibt es keine anderen Deklarationen von . Ich verwende die @ EJB-Annotation, wenn ich meine Managed Bean in der Filter-Klasse deklariere. Danke vielmals. – JPC

0

Ok, mit mehr als einem Hut-Tipp zu Bozho, hier ist, wie ich es funktionierte. In der Filterklasse I importieren:

import javax.inject.Inject; 

und meine Bean erklären, wie folgt:

@Inject 
private MyBean myBean; 

Jetzt wird dieses Objekt injiziert. Ich hatte auch ein leerer WEB-INF/beans.xml

<beans 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd" /> 

Jetzt erstellen baut es und läuft ohne eine Ausnahme zu werfen.