5

我一直在玩 JSF 2.0 复合组件,但对于composite:attribute标记中的 require 属性的用途有点困惑。文档说,如果页面作者必须为此属性提供值,则 required 属性为 true。

我将其解释为必须为所有具有required=true. 我还假设空字符串是有效值。这就是它在 Mojarra 2.0.2 中的工作方式。

使用这个简单的托管 bean:

@ManagedBean(name = "simpleMB")
@ViewScoped
public class SimpleManagedBean implements Serializable {

   private static final long serialVersionUID = -1;

   private String whatever;

   ... setter and getter
}

和复合组件:

<composite:interface>
    <composite:attribute name="value" required="true" />
</composite:interface>

<composite:implementation>
    <h:outputText value="Value: '#{cc.attrs.value}'" />    
</composite:implementation>

这些标签在 Mojarra 2.0.2 中有效:

<foo:bar value="" />
<foo:bar value="#{simpleMB.whatever}" />

但是,当我升级到 2.0.3 时,只有第一个标签有效。第二个标签导致此错误消息:

/requiredAttribute.xhtml @20,42 <foo:bar> The following attribute(s) are 
required, but no values have been supplied for them: value.

当我将 required 设置为 false 时,它​​工作正常。

我是否误解了 required 属性的含义?有人可以澄清我应该期待什么行为吗?

谢谢。

4

3 回答 3

2

我们在 required="true" 与 @ViewScoped bean 的组合中遇到了类似的问题。

在我们的案例中,bean 的行为不再像 @ViewScoped bean(每次都调用新的构造函数)。

您的问题可能是因为 bean 失去了它的范围,变量再次为空?

无论哪种情况,我能给你的唯一 awnser 就是不使用 required="true" 或使用 @SessionScoped bean。

(这可能与 Mojarra 无法处理与 @ViewScoped bean 中的属性的绑定的问题有关)

于 2011-03-11T15:21:01.570 回答
0

This seems to have been this issue, which seems to have been closed a while ago, although I cannot seem to find in which version it was included.

于 2011-09-05T09:09:36.387 回答
0

我不知道这是否是一个错误,但它是 el 表达式的本质。默认表达式类型为字符串,空字符串翻译为 null。

于 2010-11-23T12:25:49.230 回答