2013-04-16 42 views
0

爲什麼faces-config.xml中沒有view範圍?如果我不使用faces-config.xml,我將如何設置一個bean來查看範圍?在faces-config.xml中沒有視圖範圍

我已經使用了以下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; 

    } 
} 

當我使用註釋,我得到的例外是:在託管bean

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) 
+0

*「如果我不使用faces-config.xml」*爲什麼這個問題呢? – BalusC

回答

3

使用@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.檢查您的面孔,配置文件被配置爲處理JSF 2.x版作品:根據你的問題更新

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

編輯:

的錯誤信息是非常straightf orward:

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?

+0

好的,但爲什麼在faces.config.xml中沒有任何視圖範圍? –

+0

你可以請發表faces-config jsf文件版本嗎? –

+0

是否有必要實現序列化,因爲我得到一個異常 –

2

檢查中列出的xsdfaces-config.xml(例如: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

注意,豆需要實現Serializable因爲這將是存儲在視圖映射中的,視圖映射又存儲在會話中。一些 servletcontainer配置將存儲會話在磁盤 而不是在內存中。當您已將 JSF視圖狀態保存方法配置到客戶端而不是(默認)服務器時,這也是必需的。

解釋爲什麼視圖範圍要求Serializable

+0

'java.io.NotSerializableException:org.eclipse.persistence.internal.jpa.EntityManagerImpl'我在添加Serializable後收到上述異常。 –

+1

@AmlanKarmakar,這可能是因爲你注入一個不可序列化的變量到你的可序列化的託管bean中,因此使這個bean有效地不可序列化。爲了解決這個問題,您可以按照[本文](http://stackoverflow.com/a/14183778/516433)中概述的方法進行操作。 – Lucas

+0

你能給我舉個例子,我有問題要理解瞬態的概念。 –