2012-03-25 45 views
2

部署在JBoss AS 7.1.0.Final上。为什么我的ViewScoped bean不能存活h:commandButton?

我有一个非常简单的测试应用程序。它直到前一天都在按预期工作(着名的遗言),并且不再做最基本的事情,即设置输入组件的值并在动作组件中使用它。我已经把这件事剥离到了基础知识上,并且无法弄清楚发生了什么。

的index.xhtml在这里

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html"> 

<h:head> 
    <title>contacts</title> 
</h:head> 
<h:form> 
    <h:outputLabel value="Message:" /> 
    <h:inputText value="#{contactView.siteCode}" /> 
    <h:commandButton action="#{contactView.save}" value="Save" /> 

</h:form> 

</html> 

ViewScoped bean是这里

@Named 
@ViewScoped 
public class ContactView implements Serializable { 

    public ContactView() { 
    } 

    private String siteCode; 

    public String getSiteCode() { 
     System.out.println("getSiteCode: "+ siteCode); 
     return siteCode; 
    } 

    public void setSiteCode(String siteCode) { 
     System.out.println("setSiteCode: "+ siteCode); 
     this.siteCode = siteCode; 
    } 

    public String save(){ 
     System.out.println("Saving sitecode: " + siteCode); 
     return "index.jsf"; 
    } 


} 

我在做什么错?当我点击保存按钮,我得到这个输出

10:50:37,663 INFO [stdout] (http--0.0.0.0-8080-2) setSiteCode: 22 
10:50:37,663 INFO [stdout] (http--0.0.0.0-8080-2) Saving sitecode: null 
10:50:37,663 INFO [stdout] (http--0.0.0.0-8080-2) getSiteCode: null 
+1

也许有一天你有'@ ManagedBean'注释而不是'@命名':) – Osw 2012-03-25 15:17:17

回答

5

这是因为豆腐是由CDI @Named管理,而不是由JSF @ManagedBean。包javax.faces.bean的JSF范围注释仅适用于由JSF管理的bean。在CDI托管bean上,您需要使用来自javax.enterprise.context的CDI注释。但是,CDI没有视图范围的概念。最近的是@ConversationScoped,但这个管理起来比较复杂。如果不在CDI托管bean上指定范围,它将默认为请求范围。

确保您的bean由JSF管理,只要您想使用@ViewScoped即可。

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class ContactView implements Serializable { 
    // ... 
} 

此外,你还需要确保你的行动方法返回nullvoid,每当你想保留的视图范围内。

+0

感谢您的解释。我以为我从一开始就使用@Named,但那必须是我所修饰的东西之一。我基于我的应用程序在这个http://www.adam-bien.com/roller/abien/entry/simplest_possible_jsf_2_ejband我看到他现在使用ManagedBean。我没有回忆改变它,但任何事情都是可能的。在最终形式中,我想使用重定向并将网站代码放入URL中的参数列表中。我想这样做可以避免使用ViewScoped .... – april26 2012-03-26 13:19:38

+0

不客气。 – BalusC 2012-03-26 13:22:42

+2

昨天我意识到/发现/了解到seam-faces有一个与Named一起使用的ViewScoped的实现。这就是为什么我的应用程序与Named一起工作!当我决定“清理”我的POM时,问题就开始了。馊主意。我不知道为什么我首先添加了它。三天后,我终于知道为什么了!也许我应该添加这个作为答案而不是评论... – april26 2012-03-27 13:07:53

相关问题