当前位置: 首页 > 知识库问答 >
问题:

从Facelets错误页面引用CDI托管bean

钱建本
2023-03-14

我很难在一个使用JSF 2、Facelets和CDI的(非常简单的)WAR项目中获得一个通用的错误页面。

我的应用服务器是WebLogic12c,它应该支持所有这些现成的功能,但它无法显示错误页面。当我将完全相同的WAR部署到Glassfish应用程序服务器时,它可以工作。

我倾向于指责WebLogic在CDI部门存在缺陷,但可以使用一些额外的专业知识来检查我的方法是否错误。

以下是我的应用程序试图证明的内容:

执行重定向后,可以从错误页引用已经存在的CDI托管bean

该项目拥有一个@SessionScoped托管bean,用于生成显示在欢迎页面和错误页面上的内容。

欢迎页面显示由@SessionScopedbean生成的内容,并使用@ResestScopedbean仅抛出一个(运行时)?异常(反过来启动重定向到错误页)。

这是我的相关代码:

>

<?xml version="1.0" encoding="UTF-8"?>
<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">
</beans>

web/web-INF/web。xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/faces/error.xhtml?faces-redirect=true</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/faces/error.xhtml?faces-redirect=true</location>
    </error-page>
</web-app>

Web/error.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Error page</title>
    </h:head>
    <h:body>
        <h1>You are now on the error page</h1>

        <h3>Current milliseconds: #{sessionScopedBean.milliseconds}</h3>
    </h:body>
</html>

网页/索引。xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Generate exception</title>
    </h:head>
    <h:body>
        <h1>Please generate an exception of some sorts</h1>

        <h1>Current milliseconds: #{sessionScopedBean.milliseconds}</h1>

        <h:form>
            <h:commandButton action="#{exceptionGeneratingBean.generateException()}" value="Exception" />
            <h:commandButton action="#{exceptionGeneratingBean.generateRuntimeException()}" value="RuntimeException" />
        </h:form>
    </h:body>
</html>

src/java/nl/rensvanleeuwen/bean/ExceptionGeneratingBean。JAVA

package nl.rensvanleeuwen.bean;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@RequestScoped
@Named
public class ExceptionGeneratingBean {

    public void generateRuntimeExcetion() {
        throw new RuntimeException("Here is the exception!");
    }

    public void generateException() throws Exception {
        throw new Exception("Here is the exception!");
    }
}

src/java/nl/rensvanleeuwen/bean/SessionScopedBean。JAVA

package nl.rensvanleeuwen.bean;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class SessionScopedBean implements Serializable {

    public long getMilliseconds() {
        return System.currentTimeMillis();
    }
}

当我将其部署到Glassfish 3.1.2时,当按下其中一个按钮时,我会得到以下输出:

在WebLogic上,另一方面,它会爆炸,并显示以下堆栈跟踪:

####<Aug 30, 2013 11:24:26 PM CEST> <Error> <HTTP> <rens7> <131Server> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1377897866330> <BEA-101107> <[ServletContext@2045981067[app:_appsdir_ErrorPageTest_war module:ErrorPageTest.war path:null spec-version:3.0]] Problem occurred while serving the error page.
javax.servlet.ServletException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
  at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
  at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:216)
  at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:132)
  at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:338)
  at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:221)
  at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:564)
  at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:263)
  at weblogic.servlet.internal.ForwardAction.run(ForwardAction.java:22)
  at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
  at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
  at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
  at weblogic.servlet.internal.ErrorManager.handleException(ErrorManager.java:144)
  at weblogic.servlet.internal.WebAppServletContext.handleThrowableFromInvocation(WebAppServletContext.java:2239)
  at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2089)
  at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1514)
  at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
  at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
  at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
Caused By: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
  at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:612)
  at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:71)
  at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:79)
  at nl.rensvanleeuwen.bean.SessionScopedBean$Proxy$_$$_WeldClientProxy.getMilliseconds(SessionScopedBean$Proxy$_$$_WeldClientProxy.java)
  at sun.reflect.GeneratedMethodAccessor58.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:601)
  at javax.el.BeanELResolver.getValue(BeanELResolver.java:305)
  at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
  at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
  at com.sun.el.parser.AstValue.getValue(AstValue.java:138)
  at com.sun.el.parser.AstValue.getValue(AstValue.java:184)
  at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
  at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
  at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
  at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:227)
  at com.sun.faces.facelets.el.ELText$ELTextComposite.writeText(ELText.java:150)
  at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85)
  at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
  at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183)
  at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
  at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
  at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
  at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
  at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
  at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
  at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
  at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
  at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
  at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:216)
  at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:132)
  at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:338)
  at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:221)
  at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:564)
  at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:263)
  at weblogic.servlet.internal.ForwardAction.run(ForwardAction.java:22)
  at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
  at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
  at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
  at weblogic.servlet.internal.ErrorManager.handleException(ErrorManager.java:144)
  at weblogic.servlet.internal.WebAppServletContext.handleThrowableFromInvocation(WebAppServletContext.java:2239)
  at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2089)
  at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1514)
  at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
  at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
  at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
>

我还没能让这个构造工作。有没有人能指出我可能忽略的东西?

共有1个答案

越嘉茂
2023-03-14

现在球在甲骨文法庭上。WebLogic 12.1.1.0报告了漏洞17410908。

 类似资料:
  • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati

  • 我正在用CDI开发一个库。这个很好用。但是,当我试图将这个库用作项目中包含的Jar时,CDI抱怨说它无法解决对父项目中定义的托管bean的依赖关系。 MyProject-MyLib。jar-MyManagedBean 所以MyLib需要注入一个带有原型@foo注释的bean。此原型应用于MyManagedBean。 我加了豆子。我的父项目也使用xml。但好像有两个不同的CDI容器,MyLib无法访

  • 日安 我不是一个专业的程序员,我没有正式学习,我目前正在自学。所以我的问题可能看起来很愚蠢,或者不明白答案。请原谅我。 好的,问题来了: 我的例子将是一个内部团队午餐花名册,这将是当地的页面,用户可以设置午餐时间,不会改变,但会在一天结束时重置。 可以通过打开页面来查看所有更改。 我想知道应该是java和html,还是应该用什么语言创建这样的页面。 诚挚的问候

  • 我想从方法中检索注释(自定义编写的注释)。通常我可以通过访问 但是如果bean由CDI容器管理(我使用的是OpenWebBeans),那么类在运行时会得到增强。然后我必须使用超类来请求注释。目前,我试图通过在类名中查找“$$”来检测是否管理该类。但对我来说,这似乎是一个非常肮脏的解决方案。 有什么好方法可以从CDI管理的bean中检索注释吗? 详细地说,我的代码是这样的:我创建了一个注释“Cool

  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 我正在尝试在我们的支付页面上集成托管结帐页面。我可以正确获取安全令牌。当我无法将客户重定向到托管结帐页面时。通过iframe: 我得到:错误:PayPal Express结账没有设置在这个帐户上。 通过表格: 提交时,我得到:结果=25 如果我理解得很好,SecureToken和SecureTokenID应该足以打开PayPal管理器中配置的托管结帐页面,因为所有数据都是在请求安全令牌时发送的。但