Hi,
I have a big (for me) problem with primefaces / myfaces.
Server: tomcat 7, myfaces: 2.1.2, jdk 7, primefaces 3.3.1
I have simple managed bean with @ViewScope. I have an edit form. I access the
form with GET parameter:
/be/cms/article.faces?id=3
which is used to load the Article from DB. Form shows ok and is in session (i
observer session id and it does not change). Then I click submit button. I get:
-----------------
[java] DEBUG [SessionTimeoutPhaseListener.java] beforePhase: RESTORE_VIEW(1)
[java] DEBUG [SessionTimeoutPhaseListener.java] NO session timeout
detected...
[java] DEBUG [SessionTimeoutPhaseListener.java] afterPhase: RESTORE_VIEW(1)
javax.faces.application.ViewExpiredException: /be/cms/article.facesNo saved
view state could be found for the view identifier: /be/cms/article.faces
[java] at
org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:128)
~[myfaces-impl-2.1.2.jar:2.1.2]
[java] at
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
[myfaces-impl-2.1.2.jar:2.1.2]
[java] at
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
[myfaces-impl-2.1.2.jar:2.1.2]
[java] at
javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
[myfaces-api-2.1.2.jar:2.1.2]
[java] at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
[catalina.jar:7.0.26]
[java] at
org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
[tomee-catalina-4.0.0-beta-2.jar:4.0.0-beta-2]
[java] at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
[catalina.jar:7.0.26]
[java] at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
[catalina.jar:7.0.26]
[java] at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
[tomcat-coyote.jar:7.0.26]
[java] at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
[tomcat-coyote.jar:7.0.26]
[java] at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
[tomcat-coyote.jar:7.0.26]
[java] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source) [na:1.7.0_03]
[java] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
Source) [na:1.7.0_03]
[java] at java.lang.Thread.run(Unknown Source) [na:1.7.0_03]
-------------------
SessionTimeoutPhaseListener is my class that implements PhaseListener, strange
thing is that phase listener shows that the exception is probably after
RESTORE_VIEW :(.
The session is not timed out. I have org.apache.myfaces.VALIDATE = true.
ID of the session does not change. I have observed the PostConstruct entrance
but no PreDestroy on my bean so probably my bean still lives and is ready to be
bound to the view, but can not force the view to be restored.
I have used the following options:
1. facelets.BUILD_BEFORE_RESTORE = TRUE, does not matter
2. javax.faces.STATE_SAVING_METHOD = client or server, does not matter
3. changing AJAX to FALSE and using direct access does not matter
The post does
I have lost almost all my hairs. I will appreciate any help & advice. , thanks
in advance
Sources:
article.xhtml
------------------------------------------------------
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewParam name="id" value="#{articleEditBean.entryId}"
required="true"
requiredMessage="No entry specified.">
<f:validateLongRange minimum="1" />
</f:viewParam>
<f:event type="preRenderView" listener="#{articleEditBean.loadEntry}" />
</f:metadata>
<h:head>
<title>Artykul edycja</title>
</h:head>
<body>
<ui:decorate template="/templates/masterDecorator.xhtml">
<p:panel header="Edytuj artykul">
<h:panelGrid columns="2" cellpadding="5">
<p:outputLabel for="articleName" value="Nazwa"
/>
<p:inputText id="articleName"
value="#{articleEditBean.article.name}" required="true"/>
<p:outputLabel for="articleDescription"
value="Opis" />
<p:inputTextarea id="articleDescription"
rows="5" cols="120"
counter="counter" maxlength="4096"
value="#{articleEditBean.article.description}"
counterTemplate="{0} znakow pozostalo."
autoResize="false" />
<h:outputText value="" />
<h:outputText id="counter" />
<p:outputLabel for="articleContent"
value="Tresc" />
<p:editor id="articleContent"
value="#{articleEditBean.article.content}"
width="600"/>
</h:panelGrid>
</p:panel>
<p>
<p:commandButton value="Save" id="ajax" ajax="false"
actionListener="#{articleEditBean.listenSaveArticle}"
action="#{articleEditBean.saveArticle}"
icon="ui-icon-disk" />
</p>
</ui:decorate>
</body>
</html>
------------------------------------------------------
ArticleEditBean.java
------------------------------------------------------
@ViewScoped
@ManagedBean
public class ArticleEditBean implements Serializable{
/**
*
*/
private static final long serialVersionUID = -679841341548988167L;
private Article article;
public Long getEntryId() {
logger.debug("getEntryId: {}", entryId);
return entryId;
}
public void setEntryId(Long entryId) {
logger.debug("setEntryId: {} ",entryId);
this.entryId = entryId;
}
public Article getArticle() {
logger.debug("getArticle(): {}", article);
return article;
}
private Long entryId;
@EJB
private ArticleService service;
private static Logger logger =
LoggerFactory.getLogger(ArticleEditBean.class);
public void loadEntry() {
logger.debug("entering articleBean.loadEntry");
FacesContext ctx = FacesContext.getCurrentInstance();
if (ctx.isValidationFailed()) {
ctx.getApplication()
.getNavigationHandler()
.handleNavigation(ctx,
"#{articleBean.loadEntry}",
"invalid");
return;
}
article = service.read(entryId);
if (article == null) {
ctx.getApplication()
.getNavigationHandler()
.handleNavigation(ctx,
"#{articleBean.loadEntry}",
"invalid");
}
}
public void listenSaveArticle(ActionEvent e){
logger.debug("before listenSaveArticle... ");
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> requestParams =
context.getExternalContext().getRequestParameterMap();
logger.debug("end of listenSaveArticle");
}
@PreDestroy
public void preDestroy(){
logger.debug("pre destroy");
}
@PostConstruct
public void init() {
logger.debug("in post construct");
}
public String saveArticle() {
logger.debug("entering articleEditBean.saveArticle()");
if (article.getId() != null) {
service.update(article);
} else {
service.create(article);
}
addMessage("Article " + article.getId() + " saved");
logger.debug("exiting articleEditBean.saveArticle()");
return "/be/welcome.xhtml?faces-redirect=true";
}
private void addMessage(String message) {
Flash flash =
FacesContext.getCurrentInstance().getExternalContext()
.getFlash();
flash.setKeepMessages(true);
flash.setRedirect(true);
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(message));
}
public void setArticle(Article article) {
logger.debug("setArticle(): {}", article);
this.article = article;
}
------------------------------------------------------