JSF + GAE + Managed Beans

Oi pessoal,

alguém de vcs tem já implementou algo usando JSF + GAE + Managed Beans?

Estou com o seguinte problema: quando os dados do formulário são enviados, eles desaparecem.

É esse mesmo caso aqui -> http://java.dzone.com/news/jsf2-configuration-google-app

Eita… já fiz com app engine e foi perfeitamente, certeza que não é a camada de persistencia que está errada?

Localmente funciona, mas quando eu faço o deploy pro appspot.com ae não funciona.

Não ocorre nenhuma exception, mas não funciona, o managed bean perde os dados.

[quote=http://java.dzone.com/news/jsf2-configuration-google-app]
Finally, I have noticed that sometimes objects kept in session loose data. For instance, I created a session scoped managed bean called CustomerBean and added customer name and email to it. When I move to second view, the name and email address stored in the managed bean are lost. Now this happens only on appspot not on the dev server so I can’t debug and I haven’t yet figured out why it this happens. I am working on a strange hack which put a token key value in the session in every request which solves the issue but I am sure why.
If anyone has any clue why please post a comment.[/quote]
Ocorre exatamente isto comigo.

Estou usando JSF 2.0 e GAE SDK 1.53

gilberto_oliveira.

Se for possível você passar o código pra gente dar uma olhada.
Mas esta situação de você fazer uma coisa local e depois não funcionar no ambiente do GAE é normal, por isso que é recomentado sempre destar qualquer alteração no ambiente de teste online.
Ah! Já estava me esquecendo, você esta usando algum framework de persistência?

Sucesso!
Abraço!

Login.java

package novo;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Login {

    private boolean loginOk;
    private String userName;
    private String password;

    public boolean isLoginOk() {
        return loginOk;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String validateLogin() {
        if (userName.equals("gilberto")) {
            loginOk = true;
            return "secpage";
        } else {
            loginOk = false;
            return "login";
        }
    }
}

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
    <head><title>System Login</title></head>
    <body>
    <f:view>
        <h:form>
            <h:panelGrid columns="2">
                <h:outputLabel value="User Name" for="un"/>
                <h:inputText id="un" value="#{login.userName}"/>
                <h:outputLabel value="Password" for="pw"/>
                <h:inputText id="pw" value="#{login.password}"/>
            </h:panelGrid>
            <h:commandButton value="Login" action="#{login.validateLogin}"/>
        </h:form>
    </f:view>
</body>
</html>[/code]

web.xml
[code]
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>com.sun.faces.enableThreading</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
        <!-- Production-->
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>secured/secureView.jsf</welcome-file>
    </welcome-file-list>
    <filter>
        <description>Filtra todas requisições das páginas para saber se estão sendo acessadas por usuáiro autorizado.</description>
        <filter-name>FiltroLogin</filter-name>
        <filter-class>novo.FiltroLogin</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FiltroLogin</filter-name>
        <url-pattern>/secured/*</url-pattern>
    </filter-mapping>
</web-app>
[/code]

faces-config.xml
[code]<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    <managed-bean>
        <managed-bean-name>login</managed-bean-name>
        <managed-bean-class>novo.Login</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <navigation-rule>
        <from-view-id>/login.jsp</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/login.jsp</to-view-id>
            <redirect/>
        </navigation-case>
        <navigation-case>
            <from-outcome>secpage</from-outcome>
            <to-view-id>/secured/secureView.jsp</to-view-id>
            <redirect/>
        </navigation-case>
    </navigation-rule>

</faces-config>

appengine-web.xml

<?xml version="1.0" encoding="UTF-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://kenai.com/projects/nbappengine/downloads/download/schema/appengine-web.xsd appengine-web.xsd"> <application></application> <version></version> <sessions-enabled>true</sessions-enabled> </appengine-web-app>

Quando chega no filtro o manged bean tá null, e mesmo que não tenha validado, localmente quando ele volta pra tela de login o nome volta preenchido, mas no gae volta sem estar preenchido. O comportamento do GAE é diferente do local.

Olá, gilberto_oliveira!

Infelizmente vou ficar te defendo uma ajuda, não tenho muito conhecimento sobre JSF.
Estou desenvolvendo no GAE, mas estou utilizando VRaptor 3, Objectify e HTML, CSS e JavaScript.
Sry!

Sucesso!
Abraço!