在每个请求中重新实例化JSF-ViewScope bean

时间:2014-02-11 09:44:45

标签: jsf jsf-2

我已经看到很多地方描述过这个错误但总是原因不同。像this这样的帖子指出,当您在页面上包含标记处理程序库时,只会发生重新实例化的问题。但是,我有一个空项目,其中包含如下页面

<?xml version="1.0" encoding="UTF-8"?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <head>
        <title></title>
    </head>
    <body >

    <h:form>
        <f:view >
            <h:commandButton id="otxMainPanelTextBt" value="click" 
                             action="#{otherController.doSome}"/>
        </f:view>
    </h:form>

</body>
</html>

使用像这样的支持bean

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;


@ManagedBean(name = "otherController")
@ViewScoped
public class Other implements Serializable {

    private static final long serialVersionUID = -6493758917750576706L;

    public String doSome() {
        System.out.println(this);
        return "";
    }
}

以下依赖

<dependency>
  <groupId>org.apache.myfaces.core</groupId>
  <artifactId>myfaces-impl</artifactId>
  <version>2.0.2</version>
</dependency>
<dependency>
  <groupId>org.apache.myfaces.core</groupId>
  <artifactId>myfaces-api</artifactId>
  <version>2.0.2</version>
</dependency>

每次点击按钮时都会创建一个不同的对象。显然这个页面尽可能简单,我没有触发任何可能的错误原因,所以它总是发生或者我错过了什么?

我测试过将依赖项更改为2.2.0并且按预期工作但不幸的是由于项目限制,我需要保留JSF的2.0.2版本。

任何帮助都将受到高度赞赏。 谢谢!

1 个答案:

答案 0 :(得分:0)

实际上,我发现实例保持不变。问题是当点击按钮时,我总是看到在方法的toString中打印出不同的hashCodes。

constructing the instance
de.controller.Other@118ea91
de.controller.Other@1e8f930
de.controller.Other@1a38f3c

这让我觉得有不同的例子。

虽然是同一个实例,但我认为这种行为是不正确的,因为对象的hashCode在其生命周期内不应该改变。