EJB 3.1 Dependency Injection Fehlgeschlagen
habe ich eine stateless session bean so :
@WebServlet(name = "ProductController", urlPatterns = {"/ProductController"})
public class ProductController extends HttpServlet {
@EJB
private ProductFacadeBean productBean;
}
@Stateless
public class ProductFacadeBean extends AbstractFacade<Product> implements ProductFacadeLocalInterface {
@PersistenceContext(unitName = "OnlineStorePU")
private EntityManager em;
protected EntityManager getEntityManager() {
return em;
}
public ProductFacadeBean() {
super(Product.class);
}
}
@Local
public interface ProductFacadeLocalInterface {
void create(Product product);
void edit(Product product);
void remove(Product product);
Product find(Object id);
List<Product> findAll();
List<Product> findRange(int[] range);
int count();
}
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
Frage :
-
Was ist der Fehler ? Wie
es lösen ?javax.die Benennung.NamingException: Lookup
fehlgeschlagen für
"java:comp/env/Controller.ProductController/productBean'
in
SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,
java.die Benennung.factory.state=com.Sonne.corba.ee.impl.- Präsentation.rmi.JNDIStateFactoryImpl,
java.die Benennung.factory.url.pkgs=com.Sonne.enterprise.Benennung}
[Root exception
javax.die Benennung.NamingException:
Ausnahme Ejb-Lösung für Remote
ejb-ref
name=Controller.ProductController/productBean,Remote
3.x-Schnittstelle =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session'
. Tatsächliche (möglicherweise intern) Remote
JNDI-name für die Suche verwendet wird
'EJB.ProductFacadeBean#EJB.ProductFacadeBean'
[Root exception
javax.die Benennung.NamingException: Lookup
fehlgeschlagen für
'EJB.ProductFacadeBean#EJB.ProductFacadeBean'
in
SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,
java.die Benennung.factory.state=com.Sonne.corba.ee.impl.- Präsentation.rmi.JNDIStateFactoryImpl,
java.die Benennung.factory.url.pkgs=com.Sonne.enterprise.Benennung}
[Root exception
javax.die Benennung.NameNotFoundException:
EJB.ProductFacadeBean#EJB.ProductFacadeBean
nicht gefunden]]]
Die volle Ausnahme ist hier beigefügt :
HTTP Status 500 -
type Exception report
message
descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: PWC1392: Error instantiating servlet class Controller.ProductController
root cause
com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class Controller.ProductController
root cause
com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session into class Controller.ProductController
root cause
javax.naming.NamingException: Lookup failed for 'java:comp/env/Controller.ProductController/productBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Root exception is javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]]]
root cause
javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Root exception is javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]]
root cause
javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]
root cause
javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1 logs. GlassFish Server Open Source Edition 3.1
- Wenn ich die Sitzung für
entity bean mit netbeans es
erstellt die abstrakte Fassade für uns ?
Was ist der Zweck ? Ich weiß, Fassade
Muster dienen als Schnittstelle zu
route die Anfrage ? - Was ist die Verwendung von ejb-jar.xml ?
Alle Einstellungen sind Standard.
Die ejb-bean innerhalb von java-ee-6-web-Anwendung anstatt in einen weiteren Krieg oder Glas.
Glassfish 3.1 server.
Bitte helfen.
Dank.
Problem gelöst durch injizieren Schnittstelle und nicht als konkrete Klasse.
Warum Wechsel von ProductBean @EJB private ProductFacadeLocalInterface productBean und es funktioniert ?
Wenn das interface wird implementiert, indem zwei konkrete Klassen wie container, wird wissen, was zu instanziieren ?
Haben Sie keine Antwort auf Ihre Letzte Frage ?
InformationsquelleAutor nicholas | 2011-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
müssen Sie die Schnittstelle. Wenn Sie
Seam Solder
undCDI
können Sie angeben, die genaue Umsetzung mitInformationsquelleAutor Cosmin Cosmin
Sie injizieren müssen die Bohnen durch, die sich auf seiner Oberfläche und nicht an deren Umsetzung direkt. So etwas wie dieses ..
Können Sie dann den Zugriff auf die bean mit Hilfe der interface-Methoden, die Sie ausgesetzt in
ProductFacadeLocalInterface
.Wenn ein EJB-in Ihrem Fall eine stateless-bean implementiert lokale/remote-Schnittstelle, die es braucht, um den Zugriff über die Schnittstelle. In JavaEE6 und EJB3.1 ist es möglich, interface-weniger Bohnen und Spritzen, die direkt die Umsetzung sollte aber vermieden werden, für design und Wartbarkeit Gründen.
Was peterwkc Frage ? Wenn Sie 2 EJB, die eine Schnittstelle implementieren, wie sieht der container-wissen, welches man wählen ?
Sie heucheln nicht. Sie erstellen eine Lokale Schnittstelle für jede Stateless-bean, die erweitert das common interface.
InformationsquelleAutor aseychell