@ViewScoped不起作用,为每个请求创建bean

时间:2012-10-26 11:05:15

标签: spring java-ee jsf-2 migration tomcat6

我正在从JSF1.2迁移到2.1,我将faces-config.xml中bean的条目更改为注释。我尝试使用@ViewScoped而不是@RequestScoped和@ManagedProperties(对于很少的类中的许多参数),但每次我点击提交我的表单bean,注释为@ViewScoped被重新创建。对于@SessionScoped,一切都有效。

我在这里阅读了一些Q& A和This article,但我没有强迫它工作。

我将JSTL标记更改为呈现的属性,或者c:如果使用ui:param呈现。

在我的web.xml中我设置了参数:

<context-param>
  <param-name>javax.faces.PARTIAL_STATE_SAVING</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>

我尝试过javax.faces.PARTIAL_STATE_SAVING = true,但也没有用。用javax.faces.STATE_SAVING_METHOD = SERVER同样的问题。

我删除了用于测试的标签处理程序,但它也没有帮助。

在项目中使用:Mojarra 2.1.13,hibernate 3.6,spring 3.1(据我所知的更新形式2.x由我的前任),acegi-security-1.0.5,tomahawk20,urlrewrite-3.2.0。< / p>

我使用tomcat 6

修改

这是我的豆子:     打包my.package;

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

import my.package.MyOtherBean;

@ManagedBean(name="someNameBean")
@ViewScoped
//@SessionScoped
public class MyBean extends MyOtherBean {

public MyBean(){
    super();
    //XXX
    System.out.println("-->> someNameBean is being created");       
}
}



package my.package;

@ManagedBean(name="someNameMyOtherBean")
//@ViewScoped
@SessionScoped
public class MyOtherBean extends BaseBean {

private ClassWithFormFields dataIn; //getter & setter exist
//a lot of code here

}

使用bean的示例

<h:selectOneMenu value="#{someNameBean.dataIn.currencyId}" id="currencyId" tabindex="2" >
<f:selectItems value="#{someNameBean.dataIn..availableCurrencies}"/>
</h:selectOneMenu>

更新的 serviceLocalizator由Spring xml文件和JSF annotation

管理
@ManagedBean
public class BaseBean implements Serializable {

private static final long serialVersionUID = 1L;

protected transient Logger log = Logger.getLogger(this.getClass());

@ManagedProperty(value="#{serviceLocalizator}")
protected transient ServiceLocalizator serviceLocalizator;

    //few more lines

}

更新2: 我的错。感谢@kolossus,他指出了方向。 我正在寻找答案,我发现并阅读BalusC article而现在我现在,我不应该在支持bean动作中返回字符串。使用null代替字符串它可以工作。我很难理解一个视图的概念,我认为只要tab / windows是相同的ViewSoped bean id就可以了。现在我知道这是JSF View。 我是个麻烦的人。

使用@ViewSoped并重定向到新页面可能是一种方法吗?

1 个答案:

答案 0 :(得分:1)

注意:如果您从2个不同的视图引用相同的(非会话作用域)bean,则将创建该bean的两个实例

在支持JSF视图的任何类型的bean中,在JSF中导航是非常基本和直接的。

  1. 返回您尝试导航到的页面的名称(视图ID)作为公共方法的返回值

      public String navigateAway(){
       //Do whatever processing you want here
       return "page2"; //where page2 is the name of an actual .xhtml file in your application     
       }
    
  2. 返回faces_config.xml文件

    中指定的JSF导航案例结果
      public String navigateAway(){
        //Prior processing
        return "go somewhere else" ;  //where go somewhere else is a navigation outcome you've specified in your faces_config.xml file
       }    
    

    faces_config.xml文件中,您将拥有此

      <navigation-rule>
    <from-view-id>/register.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>go somewhere else</from-outcome>
        <to-view-id>/review_registration.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    

  3. 如果您希望在操作后保持在同一页面上,只需在方法中返回null而不是字符串,您将不会被带到另一个视图。此外,根据您的支持bean的范围,如果返回空值,您可以确定将使用相同的bean实例

    有关详细信息,请查看here