【问题标题】:@ViewScoped @ManagedBean destroyed when using <h:link includeViewParams="true">@ViewScoped @ManagedBean 在使用 <h:link includeViewParams="true"> 时被破坏
【发布时间】:2015-12-19 18:05:37
【问题描述】:

我正在使用 Mojarra 2.2.12。我有一个情况,@ViewScoped@ManagedBean 在页面加载时立即被销毁,尽管视图没有结束。仅使用&lt;h:body&gt; 中的以下内容即可重现该问题:

<h:outputText value="#{testBean.value}" />
<h:link outcome="other" includeViewParams="true">link</h:link>

other 必须引用不同的视图,而不是同一个视图。重现问题不需要&lt;f:viewParam&gt;

还有下面的bean:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {

    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct on " + this);
    }

    @PreDestroy
    public void clear() {
        System.out.println("@PreDestroy on " + this);
    }

    public String getValue() {
        return "test";
    }

}

如果我们去掉includeViewParams="true"属性,那么bean不会立即被销毁。为什么includeViewParams="true"会导致这种行为?

【问题讨论】:

  • 你是说它在页面加载时被破坏还是仅在点击链接时被破坏?
  • 该 bean 在页面加载时被销毁。
  • 根据目前提供的信息无法重现。
  • 那么问题中的信息不足。想象一下,我们有一个完全空白的项目,所有内容都设置为最低限度和默认值,我们如何重现您的问题?这个问题必须涵盖所有这些。
  • 感谢您花时间帮助我,我系统地复制了它。我使用一个非常简单的展示项目。该项目在 org.exemple.PF.showcase.TestBean 9 月记录 PostConstruct。 2015 年 2 月 25 日上午 9:11:13 com.sun.faces.application.view.ViewScopeManager 信息:CDI @ViewScoped bean 功能不可用 PreDestroy on org.exemple.PF.showcase.TestBean

标签: jsf destroy view-scope viewparams


【解决方案1】:

在pom.xml中添加这个依赖,我通过了。

<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.2</version>
</dependency>

【讨论】:

  • 请阅读 cmets:"@B...c,我不能使用 CDI,因为该项目基于 Spring,CDI/spring 集成并非易事。是 bug 还是正常功能?”
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2012-12-22
  • 2022-11-04
  • 2017-01-09
  • 2014-11-21
  • 2011-11-02
相关资源
最近更新 更多