JSF:为什么UIComponents需要一个no-args构造函数?

时间:2010-11-29 10:03:19

标签: java jsf

如果没有一个,组件呈现正常,但是,使用带有可重新渲染目标的AJAX失败(IllegalStateException)。

我猜UIComponents需要符合JavaBeans规范。但为什么他们需要非args构造函数?如果我从模板中调用UIComponent,我理解运行时需要使用非args构造函数初始化类,然后设置任何属性,但在这种情况下,我是以编程方式添加组件:

MyComponent comp = new MyComponent("foo", "bar");
getChildren().add(comp);

所以我没有调用非args构造函数,我不知道为什么JSF会像AJAX那样只重新渲染组件,而不是从组件类创建一个新实例?

3 个答案:

答案 0 :(得分:3)

您没有调用它,但JSF可能需要实例化该组件。

查看StateHolder界面(由UIComponent实现)。它明确指出需要一个无参数的构造函数。这是因为这是一种保存和恢复状态的自定义机制。

答案 1 :(得分:2)

问题是JSF组件在请求之间自动序列化和反序列化。默认构造函数(虽然理论上并非绝对必要)使得这更容易,并且是Serializable API所必需的。

来自Serializable文档:

  

允许不可序列化的子类型   要序列化的类,子类型   可以承担储蓄的责任   并恢复状态   supertype的公共,受保护和(如果   可访问的包字段。该   子类型可能承担此责任   只有当它扩展的类有一个   可访问的no-arg构造函数   初始化类的状态。它是一个   声明一个Serializable类的错误   如果不是这样的话。错误   将在运行时检测到。

答案 2 :(得分:2)

JSF框架必须能够实例化UIComponent类的新实例。在请求之间不需要将UI树保存在RAM中,在这种情况下,使用反射来恢复它。

UIComponent实现不实现Serializable而不是JavaBeans(根据严格的定义)。实现Serializable没有用,因为组件可以与其状态具有1:n关系(例如,它们是重复控件的子项)。