myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jarosław Szczepankiewicz <jarr...@poczta.onet.pl>
Subject ViewExpiredException with valid session
Date Thu, 09 Aug 2012 12:11:08 GMT
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;
	}
------------------------------------------------------


Mime
View raw message