Jsf 2 JSF ViewScope bean不正确的哈希代码实现?
我正在JSF上开发一个简单的应用程序,具有以下依赖性Jsf 2 JSF ViewScope bean不正确的哈希代码实现?,jsf-2,Jsf 2,我正在JSF上开发一个简单的应用程序,具有以下依赖性 <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-impl</artifactId> <version>2.0.2</version> </dependency> <dependenc
<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>
如果我根据toString源代码多次单击commandButton,它应该会写
class name+hashCode
但它写的东西如下
de.controller.Other@118ea91
de.controller.Other@1e8f930
de.controller.Other@1a38f3c
因此,每次我们单击viewscoped bean时,都会有一个不同的哈希代码。这是不对的吗?我尝试过会话bean,但这没有发生
编辑
我按照建议用下面的方法修改了课堂
import java.io.Serializable;
import javax.annotation.PostConstruct;
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;
@PostConstruct
public void init()
{
System.out.println("Post Construction");
}
public Other()
{
System.out.println("Constructor");
}
public void doSome() {
System.out.println(this);
}
}
我在点击多次后发现了这个输出
Constructor
Post Construction
de.controller.Other@b748dd
de.controller.Other@1620dca
de.controller.Other@116358
de.controller.Other@73cb2d
de.controller.Other@1cc3ba0
因此,构造函数和后构造函数方法只被调用一次,尽管如此,对象在每次调用中仍然有不同的哈希代码。这很奇怪,因为不带参数的构造函数应该在托管bean实例化上被调用,但事实并非如此,所以我仍然不明白如何多次创建对象?当您从操作方法返回non-
null
时,会创建一个新视图
如果要保持当前视图的活动状态,只需从action方法返回null
或void
例如
另见:
也就是说,您认为这是一个问题的结论是正确的,但是您基于您的结论“不正确的hashcode实现”的理由毫无意义。每次都是物理上不同的bean实例。在类中添加一个默认构造函数,在其上放置一个断点,您将看到每次从action方法返回后都会调用它,创建一个全新的实例。使用更新版本的myfaces core。最新版本(2.0.20、2.1.14)被认为是最稳定的。这看起来像是史前时代解决的一个古老问题。我根据你的建议做了一个编辑。谢谢
import java.io.Serializable;
import javax.annotation.PostConstruct;
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;
@PostConstruct
public void init()
{
System.out.println("Post Construction");
}
public Other()
{
System.out.println("Constructor");
}
public void doSome() {
System.out.println(this);
}
}
Constructor
Post Construction
de.controller.Other@b748dd
de.controller.Other@1620dca
de.controller.Other@116358
de.controller.Other@73cb2d
de.controller.Other@1cc3ba0
public void doSome() {
System.out.println(this);
}