【问题标题】:No view scope in faces-config.xmlfaces-config.xml 中没有视图范围
【发布时间】:2013-04-09 01:22:09
【问题描述】:

为什么faces-config.xml 中没有view 作用域?如果我不使用 faces-config.xml,我将如何设置 bean 来查看范围?

我使用了以下 bean 文件:

@ManagedBean
@ViewScoped
public class StatusBean2 implements Serializable  {

    /**
     * 
     */
    private static final long serialVersionUID = -7528998562821856315L;
    private EntityManager em;

    public StatusBean2() {
        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("FreeBird");
        em = emf.createEntityManager();
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        int toIndex = 5;
       session.setAttribute("toIndex", toIndex);

    }
    public List<Status> getStatusList() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        User user = (User) session.getAttribute("userdet");
        Query query = em.createQuery("SELECT s FROM Status s WHERE s.email='"
                + user.getEmail() + "' ORDER BY s.timeMillis desc",
                Status.class);
        List<Status> results = query.getResultList();
        Query query1 = em.createQuery("SELECT f FROM Friend f WHERE f.email='"
                + user.getEmail() + "'", Friend.class);
        List<Friend> results1 = query1.getResultList();
        Iterator<Friend> it = results1.listIterator();
        while (it.hasNext()) {
            String email = it.next().getFriendEmail();
            Query query2 = em.createQuery(
                    "SELECT s FROM Status s WHERE s.email='" + email
                            + "' ORDER BY s.timeMillis desc", Status.class);
            List<Status> results2 = query2.getResultList();
            results.addAll(results2);

        }
        Collections.sort(results);

        int toIndex = (int) session.getAttribute("toIndex");
        List<Status> subList = results.subList(0, toIndex);

        return subList;

    }
}

我在使用注解时遇到的异常如下:

Apr 16, 2013 8:41:23 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/Home.xhtml]
java.io.NotSerializableException: com.bean.StatusBean2
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at java.util.HashMap.writeObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeArray(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at java.util.HashMap.writeObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:293)
    at com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:167)
    at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:119)
    at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:155)
    at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:221)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:406)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Apr 16, 2013 8:41:23 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/FreeBird_New2] threw exception
java.io.NotSerializableException: com.bean.StatusBean2
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at java.util.HashMap.writeObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeArray(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at java.util.HashMap.writeObject(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:293)
    at com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:167)
    at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:119)
    at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:155)
    at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:221)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:406)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • "如果我没有使用 faces-config.xml" 那么为什么会出现这个问题呢?

标签: jsf-2


【解决方案1】:

在托管 bean 上使用 @ViewScoped 注解:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class AViewScopedBean {
    //managed bean contents...
}

如果你不喜欢注释配置(真的很奇怪),你可以在 faces-config.xml 上设置视图范围

<managed-bean>
    <managed-bean-name>aViewScopedBean<managed-bean-name>
    <managed-bean-class>some.package.AViewScopedBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
</managed-bean>

请注意,此仅适用于 JSF 2。检查您的 faces-config 文件是否已配置为处理 JSF 2.x 版本:

<!-- relevant part of faces-config.xml file for this Q/A -->
<faces-config ... version="2.1">

根据您的问题更新进行编辑:

错误信息非常简单:

java.io.NotSerializableException: com.bean.StatusBean2

这意味着您的com.bean.StatusBean2 还必须实现Serializable 接口。来自java.io.Serializable 文档:

在遍历图时,可能会遇到不支持 Serializable 接口的对象。在这种情况下,NotSerializableException 将被抛出,并将识别不可序列化对象的类。 (这是你得到的错误)

您可以在此处了解有关 Java 序列化的更多信息:Java Serialization

根据您的问题:是否有必要实现可序列化?,BalusC 已经发布了一个很好的答案/解释:JSF backing bean should be serializable?

【讨论】:

  • 能否请您发布faces-config jsf文件版本?
  • 是否有必要实现可序列化,因为我遇到了异常
  • @AmlanKarmakar 您能否编辑您的问题并添加错误的堆栈跟踪?
  • @AmlanKarmakar,是的,Serializable 是必需的,请参阅下面的 my answer
【解决方案2】:

检查faces-config.xml 中列出的xsd(例如:http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd)应该会显示view 范围是允许的托管bean 范围:

  <xsd:complexType name="faces-config-managed-bean-scopeOrNoneType">
    <xsd:annotation>
      <xsd:documentation>
        <![CDATA[[
        Defines the legal values for the <managed-bean-scope>
        element's body content, which includes all of the scopes
        normally used in a web application, plus the "none" value
        indicating that a created bean should not be stored into
        any scope.  Alternatively, an EL expression may be used
        as the value of this element.  The result of evaluating this
        expression must by of type java.util.Map.

        ]]>
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:restriction base="javaee:string">
        <xsd:pattern value="view|request|session|application|none|#\{.*\}"/>
      </xsd:restriction>
    </xsd:simpleContent>
  </xsd:complexType>

假设 jsf 2.0 或更高版本

这本身并不是一个新的答案,只是另一种方式让你自己发现它是允许的

--------------- 编辑----

查看this article:

请注意,bean 需要实现 Serializable,因为它将是 存储在视图地图中,而视图地图又存储在会话中。一些 servletcontainer 配置将会话存储在磁盘上 而不是在内存中。当您已配置时,这也是强制性的 JSF 视图状态保存方法到客户端而不是(默认)服务器。

解释为什么视图范围需要Serializable

【讨论】:

  • java.io.NotSerializableException: org.eclipse.persistence.internal.jpa.EntityManagerImpl 添加 Serializable 后出现上述异常。
  • @AmlanKarmakar,这可能是因为您将不可序列化的变量注入到可序列化的托管 bean 中,从而使 bean 有效地不可序列化。为了解决这个问题,您可以按照this article 中概述的方法。
  • 你能给我举个例子吗,我很难理解瞬态的概念。
  • @AmlanKarmakar 瞬态意味着当对象被序列化时变量的值被遗漏了。这反过来意味着当对象被反序列化时,该变量的值将为空。这实际上意味着您无法安全地注入该依赖项。相反,您应该更喜欢 BalusC 答案中概述的延迟加载方法。
  • @AmlanKarmakar 我的回答中有关 Java 序列化的链接中涵盖的所有内容。请注意,这些链接是为了审查而存在的。
猜你喜欢
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多