如果没有一个,组件呈现正常,但是,使用带有可重新渲染目标的AJAX失败(IllegalStateException)。
我猜UIComponents需要符合JavaBeans规范。但为什么他们需要非args构造函数?如果我从模板中调用UIComponent
,我理解运行时需要使用非args构造函数初始化类,然后设置任何属性,但在这种情况下,我是以编程方式添加组件:
MyComponent comp = new MyComponent("foo", "bar");
getChildren().add(comp);
所以我没有调用非args构造函数,我不知道为什么JSF会像AJAX那样只重新渲染组件,而不是从组件类创建一个新实例?
答案 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关系(例如,它们是重复控件的子项)。