2012-10-15 46 views
0

後回數據我使用Eclipse 3.7 GAE撐着發展。我的應用程序使用JSF和數據存儲,並設置爲每https://sites.google.com/a/wildstartech.com/adventures-in-java/Java-Platform-Enterprise-Edition/JavaServer-Faces/javaserver-faces-20/configuring-javaserver-faces-20-to-run-on-the-google-appengine。在我的開發系統中,它運行良好。但是,當部署到GAE中,SessionScoped豆在失去後回的數據:SessionScoped豆失去了對谷歌的AppEngine

// Input facelet 
<h:outputLabel for="popupCal">Date </h:outputLabel> 
<p:calendar value="#{editEntry.current.date1}" id="popupCal" /> 
<h:outputLabel for="code">Code </h:outputLabel> 
<h:inputText id="code" value="#{editEntry.current.accountCode}"/> 
<h:outputLabel for="amt">Amount </h:outputLabel> 
<h:inputText id="amt" value="#{editEntry.current.amountInDollars}"/> 
<h:commandButton action="#{editEntry.createCashExpenditure}" value="Create Entry"/> 


@ManagedBean(name="editEntry") 
@SessionScoped 
public class EditEntry extends AbstractEntryBean implements Serializable { 

@ManagedProperty(value="#{sessionBean}") 
protected SessionBean sessionBean; 

@ManagedProperty(value="#{dao}") 
protected Dao dao; 

@PostConstruct 
public void init() { 
Logger.getLogger(getClass().getName()).log(Level.WARNING, "dao is null? {0}", dao==null); 
    setTran_id(0L); 
     entries.clear(); 
     setCurrent(new Entry()); 
     getCurrent().clear(); 
     ... 
     this.refreshEntries(); 
} 

public void refreshEntries() { 
    entries = dao.getEntries(current.getFinyr(), getTran_id()); 
    Logger.getLogger(getClass().getName()).log(Level.INFO, "entries has {0} items", entries.size()); 
} 

public String createCashExpenditure() { 
    if (dao == null) { 
     Logger.getLogger(getClass().getName()).log(Level.WARNING, "dao is null"); 
     return null; 
    } 
    entries.clear(); 
    Entry e = new Entry(); 
    e.clear(); 
    e.setAccountCode(current.getAccountCode()); 
    e.setAccountName(dao.lookupAccoutName(e.getAccountCode())); 
    e.setAmount(current.getAmount()); 
    e.setDate1(current.getDate1()); 
    e.setTran_id(getTran_id()); 
    Key key = dao.saveEntry(e, sessionBean.getFinyr()); 
    e.setId(key.getId()); 
    entries.add(e); 
    current = e; 
    this.setTran_id(e.getTran_id()); 
    Logger.getLogger(getClass().getName()).log(Level.INFO, "current account is: {0}", current.getAccountCode()); 
    return "newEntry?faces-redirect=true"; 
} 

... 

}

newEntry.xhtml 
    <p:dataTable id="items" value="#{editEntry.entries}" var="item"> 
// editEntry.entries is EMPTY! 

當EditEntry.createCashExpenditure()被調用時,該日誌顯示填充EditEntry.current正確,並保存到數據存儲區。數據存儲查看器也顯示數據。但在後回,在newEntry.xhtml的facelet,editEntry.entries變空,EditEntry.current失去所有的數據。

我已經到位ForceSessionSerializationPhaseListener在http://java.zacheusz.eu/google-app-engine-http-session-vs-jsf-en/394/日誌中提到表示該監聽器被調用。

在web.xml中,javax.faces.PROJECT_STAGE是生產,

+0

請調查會話cookie流量,並將結果報告。 – BalusC

+0

沒什麼特別的。第一次訪問時,我得到了JSESSIONID;在用Gmail帳戶登錄後,我也得到了ACSID。值和兩個cookie的到期日期之前和業務方法createCashExpenditure後保持不變。 – cpliu338

回答

0

我面臨着同樣的問題,重定向後,前一交易日走了。它只發生在部署在線。

我認爲這是由於設置爲「客戶」爲javax.faces.STATE_SAVING_METHOD(在web.xml)會話變量

所以重定向之前,我需要明確設置會話如下:

getSessionScope().put(sessionname,sessionObj); 

public Map getSessionScope() { 
    return getFacesContext().getExternalContext().getSessionMap(); 
}