Validation 检查自定义VALDATOR中的必填字段

Validation 检查自定义VALDATOR中的必填字段,validation,jsf,composite-component,required,Validation,Jsf,Composite Component,Required,我已经设置了一个自定义验证器,可以在复合组件的元素上运行。看起来是这样的: <myproject:myComponent> <f:validator validatorId="customValidator" for="validatedField" /> </myproject:myComponent> <composite:interface> <composite:editableValueHolder name="v

我已经设置了一个自定义验证器,可以在复合组件的元素上运行。看起来是这样的:

<myproject:myComponent>
    <f:validator validatorId="customValidator" for="validatedField" />
</myproject:myComponent>
<composite:interface>
    <composite:editableValueHolder name="validatedField" targets="validatedField" />
</composite:interface>
<composite:implementation>
    <h:inputText id="validatedField" />
</composite:implementation>
<myproject:myComponent>
    <f:validator validatorId="customValidator" for="validatedField" />
    <f:validateRequired for="validatedField" />
</myproject:myComponent>
该页面显示了我创建的元素列表,每个元素都有一个编辑按钮(以及我省略的其他内容)。单击“编辑”按钮,将弹出一个窗口,其中包含复合组件(以及一个保存按钮,为清晰起见,再次省略),我可以在其中编辑元素

问题是,当我将
javax.faces.VALIDATE\u EMPTY\u FIELDS
设置为
true
时,在设置填充编辑窗口的数据对象之前,会调用验证器,它会因为我有空字段而对我咆哮。(并在设置数据对象之前中止执行,因此所有字段都显示为空。)

(此外,我注意到当
VALIDATE\u EMPTY\u FIELDS
设置为
false
时,我第二次和随后单击编辑按钮也会触发对验证器的调用。这看起来无害,但不是我所期望的行为。)

我在Glassfish下运行,所以我希望
能够工作——所以可能我用错了。我是这样用的:

<myproject:myComponent>
    <f:validator validatorId="customValidator" for="validatedField" />
</myproject:myComponent>
<composite:interface>
    <composite:editableValueHolder name="validatedField" targets="validatedField" />
</composite:interface>
<composite:implementation>
    <h:inputText id="validatedField" />
</composite:implementation>
<myproject:myComponent>
    <f:validator validatorId="customValidator" for="validatedField" />
    <f:validateRequired for="validatedField" />
</myproject:myComponent>

我做错了吗?

只有在web应用程序中启用JSR303 bean验证时,
才会起作用(在与Java EE web概要文件兼容的服务器中,如Glassfish、JBoss as和TomEE中通常如此,但在像Tomcat这样的简单ServletContainer中则不然)。如果您的webapp没有,那么您需要在
web.xml
中手动强制对空字段进行bean验证,如下所示:

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>

javax.faces.VALIDATE_空_字段
真的

您是否尝试过向组件添加名为“required”的属性,并将其值作为
required=“#{cc.attrs.required}”
?@elias:Huh传递给
h:inputText
。我原以为这是行不通的(修补复合组件内部的验证并不是一条富有成效的调查路线),但。。。好吧,设置
required=“true”
(我不需要它是可配置的——该字段始终是必需的)仍然不起作用,但不是出于我预期的原因。它的行为与我在上面的编辑中所描述的一样:在填充备份对象之前调用了验证器,因此当我单击编辑按钮时,会得到一条错误消息和一堆空字段。所以,至少要感谢你给了我一种新的失败方式。:-)哦,天哪。在复合组件中放置验证器现在可以工作了!很明显,我犯了另一个错误(自从纠正后),这让我觉得这是一个失败的选择。不管怎样,将验证器塞进组件并使用“required”属性可以准确地给出我想要的行为。@Blairhippo您可以发布一个问题的答案,说明您的错误假设是什么以及您是如何解决问题的。谢谢,但它仍然不起作用。有关更多详细信息,请参见我的编辑。因此,对话框与编辑按钮的形式相同,因此在按下编辑按钮时也会进行处理?将对话框置于该窗体之外,并赋予对话框自己的窗体。至于Glassfish问题,哪个版本?您是否在视图中的某个位置有
?Glassfish 3.1.2。字符串“validateBean”没有出现在项目中的任何地方,所以看起来不像。至于让对话框有自己的形式,这听起来是一种非常有效的方法和更好的架构。我将重构。