Ansichtsbereich: java.io.NotSerializableException: javax.faces.component.html.HtmlInputText

Jedes Mal, wenn eine Schaltfläche eine Aktion von der Backing-Bean aufruft, tritt ein Fehler auf. Gilt nur für Beans mit einem View-Bereich und ich habe keine Möglichkeit gefunden, dies ohne Regression über andere Module im Code zu beheben.

DefaultFacele E   Exiting serializeView - Could not serialize state: javax.faces.component.html.HtmlInputText 
java.io.NotSerializableException: javax.faces.component.html.HtmlInputText
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)

Oder auch:

com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0014E: Uncaught service() exception 
root cause Faces Servlet: ServletException: /jspFiles/jsf/Deployments/editQueue.faces No saved view state could be found for the view identifier /jspFiles/jsf/Deployments/editQueue.faces 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:205) 
Caused by: javax.faces.application.ViewExpiredException: /jspFiles/jsf/Deployments/editQueue.faces No saved view state could be found for the view identifier:  /jspFiles/jsf/Deployments/editQueue.faces
    at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute (RestoreViewExecutor.java:128)

faces-config.xml

<managed-bean>
  <managed-bean-name>pc_EditQueue</managed-bean-name>
  <managed-bean-class>pagecode.jspFiles.jsf.deployments.EditQueue</managed-bean-class>
  <managed-bean-scope>view</managed-bean-scope>
  <managed-property>
    <property-name>queueDeploymentBean</property-name>
    <value>#{queueDeploymentBean}</value>
  </managed-property>
</managed-bean>

web.xml

<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
</context-param>
<context-param>
  <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
  <param-value>true</param-value>
</context-param>

Bohne

@ManagedBean
@ViewScoped
public class EditQueue extends PageCodeBase implements Serializable {
  private static final long serialVersionUID = -1L;
  public String doButtonAddAction() {
    // calls manager (long)
    FacesUtil.setViewMapValue("queueDeploymentBean", queueDeploymentBean);
    return "";
}

Ich lese dasVorschla, um SERIALIZE_STATE_IN_SESSION auf false zu setzen, und diese Lösung funktioniert für diese View-Scope-Bean. Dieser Fix ist jedoch mit hohen Kosten verbunden: Viele der in der Anwendung vorhandenen Module funktionieren nicht mehr, sodass ich diesen Fix dort nicht verwenden kann. Einige der beobachteten Regressionen sind:

// returns null must be changed with FacesUtil.getSessionMapValue("userId"); 
getSessionScope().get("userId");`

// returns null must be changed with FacesUtil.getViewMapValue("linkerBean");
linkerBean = (Linker) getManagedBean("linkerBean");`

// NPE so must be changed with FacesContext.getCurrentInstance().addMessage(...)
getFacesContext().addMessage(...)`

Also meine Fragen sind:

Warum die NotSerializableException, obwohl die Bean Serializable implementiert? Gibt es eine Möglichkeit, den Parameter SERIALIZE_STATE_IN_SESSION nur auf eine Teilmenge der Beans anzuwenden oder nicht?

Gibt es eine andere Lösung, um meinen View-Scope zum Laufen zu bringen (ohne ihn ändern zu müssen, um den Scope anzufordern, oder sonst)?

WebSphere 8.0.0.3, Java 1.6.0, JSF 2.0, RichFaces 4.2.3.Final

Antworten auf die Frage(2)

Ihre Antwort auf die Frage