【发布时间】:2014-12-16 15:38:03
【问题描述】:
我在我的应用程序中使用了一个复合组件,它在选项卡视图中声明和呈现一个方面部分:
<composite:facet name="ambienteEspecifico" required="true"/>
...
<p:tabView value="#{cc.attrs.gerenciador.entries}" var="servidor">
<p:tab title="#{servidor.key}">
<composite:renderFacet name="ambienteEspecifico"/>
</p:tab>
</p:tabView>...
问题是当我使用组件时,如果我输入任何输入标签,例如:
<f:facet name="ambienteEspecifico">
<h:inputText value="#{servidor.value.espaco}"/>
</f:facet>
服务器返回“目标无法访问,标识符'servidor'解析为空:javax.el.PropertyNotFoundException”。如果我更改为输出标签:
<f:facet name="ambienteEspecifico">
<p:outputLabel value="#{servidor.value.espaco}" />
</f:facet>
值正确显示,没有抛出任何异常。所以似乎问题只与输入组件有关。如果我把输入标签放在组件端:
<p:tabView value="#{cc.attrs.gerenciador.entries}" var="servidor">
<p:tab title="#{servidor.key}">
<composite:renderFacet name="ambienteEspecifico"/>
<h:inputText value="#{servidor.value.espaco}"/>
</p:tab>
</p:tabView>
它也可以正常工作而不会引发任何异常。我在处理一个错误吗?
顺便说一句,我用的是jsf 2.2.2.
谢谢!
【问题讨论】:
-
与输出不同,输入需要一个非空对象来操作。不知何故,servidor 在到达 amienteEspecifico 时为空。
-
奇怪的是,即使抛出异常,输入也会显示 server.value.espaco 的默认值。我尝试在构造函数上将其设置为 5,并且值 5 显示在输入中。
-
我不认为 server 为空,因为输出显示了 server.value.espaco 的真实值。奇怪的是,即使在输入中显示了值 5,但应用程序会抛出 PropertyNotFound 异常。
-
不知道为什么会这样。您可以选择使用
代替吗?我知道它可以工作,因为它不在乎您放入什么,它只会将其按原样插入到组合中,然后再将其创建到组件树中。 -
我已经用 insertChildren 测试了代码并且它有效,但是我不能使用 insertChildren,因为我有多个标签,我必须在复合组件的不同位置插入。最后我别无选择,只能更改我的代码以支持 insertChildren。
标签: jsf-2