没有可用的 EjbContext
No EjbContext available
我正在使用 JBoss AS 7.1 开发带有外部数据库 (Postgres) 的简单 EJB 应用程序。
我想在 Bean 中找出当前登录用户的用户名。
我收到此异常:
javax.servlet.ServletException: JBAS014558: No EjbContext available as no EJB invocation is active
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
根本原因:
javax.naming.NamingException: JBAS014558: No EjbContext available as no EJB invocation is active [Root exception is java.lang.IllegalStateException: JBAS014558: No EjbContext available as no EJB invocation is active]
org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:135)
org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:74)
org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
org.jboss.as.naming.InitialContext.lookup(InitialContext.java:123)
org.jboss.as.naming.NamingContext.lookup(NamingContext.java:214)
javax.naming.InitialContext.lookup(InitialContext.java:411)
com.FantasyGame.DataProviderBean.getForests(DataProviderBean.java:130)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:735)
javax.el.BeanELResolver.invoke(BeanELResolver.java:467)
javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246)
org.apache.el.parser.AstValue.getValue(AstValue.java:159)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:731)
javax.faces.component.UIData.getDataModel(UIData.java:1798)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
javax.faces.component.UIData.encodeBegin(UIData.java:1118)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1777)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
尝试访问上下文时:
@Singleton
@ManagedBean(name = "dataProviderBean")public class DataProviderBean {
//...
InitialContext initialContext = new InitialContext();
EJBContext sessionContext = (SessionContext)initialContext.lookup("java:comp/EJBContext");
我正在从 .xhtml 页面访问 dataProviderBean:
<h:dataTable value="#{dataProviderBean.getForests()}" var="category">
我认为在配置中添加 jndi.properties 文件会有所帮助,但它仍然不起作用。我是初学者,不知道我错过了什么。你知道是什么导致了这个问题吗?我很乐意提供更多信息。
提前致谢。
我认为不可能从 ManagedBean
得到 EJBContext
。您应该从 EJB bean 内部获取 EJBContext
。 Here 是如何获得 EJBContext
.
的教程
好的,我完成了这项工作。
可能就像@Szarpul 提到的那样,无法从 ManagedBean 获取 EJBContext。因此,我创建了另一个 class 来提供上下文:
@Stateless
public class ContextProviderBean {
@Resource
private SessionContext sctx;
public void setSctx(SessionContext sctx) {
this.sctx = sctx;
}
public SessionContext getSctx() {
return sctx;
}
}
并将其添加到我的 ManagedBean:
@ManagedBean(name = "dataProviderBean")
public class DataProviderBean {
@EJB
private ContextProviderBean ctxProvider;
public DataProviderBean() {
super();
ctxProvider = new ContextProviderBean();
}
//...
}
这样我就可以访问 DataProviderBean 中任何地方的上下文:
EJBContext sessionContext = ctxProvider.getSctx();
String currentUser = sessionContext.getCallerPrincipal().getName();
我正在使用 JBoss AS 7.1 开发带有外部数据库 (Postgres) 的简单 EJB 应用程序。
我想在 Bean 中找出当前登录用户的用户名。 我收到此异常:
javax.servlet.ServletException: JBAS014558: No EjbContext available as no EJB invocation is active
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
根本原因:
javax.naming.NamingException: JBAS014558: No EjbContext available as no EJB invocation is active [Root exception is java.lang.IllegalStateException: JBAS014558: No EjbContext available as no EJB invocation is active]
org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:135)
org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:74)
org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
org.jboss.as.naming.InitialContext.lookup(InitialContext.java:123)
org.jboss.as.naming.NamingContext.lookup(NamingContext.java:214)
javax.naming.InitialContext.lookup(InitialContext.java:411)
com.FantasyGame.DataProviderBean.getForests(DataProviderBean.java:130)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:735)
javax.el.BeanELResolver.invoke(BeanELResolver.java:467)
javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246)
org.apache.el.parser.AstValue.getValue(AstValue.java:159)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:731)
javax.faces.component.UIData.getDataModel(UIData.java:1798)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
javax.faces.component.UIData.encodeBegin(UIData.java:1118)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1777)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
尝试访问上下文时:
@Singleton
@ManagedBean(name = "dataProviderBean")public class DataProviderBean {
//...
InitialContext initialContext = new InitialContext();
EJBContext sessionContext = (SessionContext)initialContext.lookup("java:comp/EJBContext");
我正在从 .xhtml 页面访问 dataProviderBean:
<h:dataTable value="#{dataProviderBean.getForests()}" var="category">
我认为在配置中添加 jndi.properties 文件会有所帮助,但它仍然不起作用。我是初学者,不知道我错过了什么。你知道是什么导致了这个问题吗?我很乐意提供更多信息。
提前致谢。
我认为不可能从 ManagedBean
得到 EJBContext
。您应该从 EJB bean 内部获取 EJBContext
。 Here 是如何获得 EJBContext
.
好的,我完成了这项工作。 可能就像@Szarpul 提到的那样,无法从 ManagedBean 获取 EJBContext。因此,我创建了另一个 class 来提供上下文:
@Stateless
public class ContextProviderBean {
@Resource
private SessionContext sctx;
public void setSctx(SessionContext sctx) {
this.sctx = sctx;
}
public SessionContext getSctx() {
return sctx;
}
}
并将其添加到我的 ManagedBean:
@ManagedBean(name = "dataProviderBean")
public class DataProviderBean {
@EJB
private ContextProviderBean ctxProvider;
public DataProviderBean() {
super();
ctxProvider = new ContextProviderBean();
}
//...
}
这样我就可以访问 DataProviderBean 中任何地方的上下文:
EJBContext sessionContext = ctxProvider.getSctx();
String currentUser = sessionContext.getCallerPrincipal().getName();