您的问题是您正在尝试将另一个字段 ( invitation.id
) 验证到newText
字段验证器中(我认为这不可能,但我不确定)。
但是,您可以将其拆分为两个验证器,从而引发与失败案例相对应的消息,恕我直言,这更正确;
<field name="invitation.id">
<field-validator type="required">
<message>${getText("validation.invitation.id.required")}</message>
</field-validator>
</field>
<field name="newText">
<field-validator type="fieldexpression">
<param name="expression">
<![CDATA[
newText != null && !newText.trim().empty())
]]>
</param>
<message>${getText("validation.newText.required")}</message>
</field-validator>
</field>
, 如果你需要修剪它,否则它可能会变得简单
<field name="invitation.id">
<field-validator type="required">
<message>${getText("validation.invitation.id.required")}</message>
</field-validator>
</field>
<field name="newText">
<field-validator type="requiredString">
<message>${getText("validation.newText.required")}</message>
</field-validator>
</field>
请注意,这required
适用于每个非文本字段,而requiredString
仅适用于文本字段。
表达式验证器非常强大,但它应该用于更复杂的目的:
例如,如果您想针对从您的 Action 动态读取(通过 Getter)的另一个日期来验证日期;假设您之前选择了一个用户,并且您需要根据用户开始和结束有效期间隔验证页面中的日期;但是如果没有插入日期,您也想通过验证,因为它已经由所需的验证器处理(因此您不会引发两条消息):
<field name="inputDate">
<field-validator type="required">
<message><![CDATA[ Input Date is mandatory ]]></message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">
<![CDATA[
inputDate==null ||
(inputDate >= chosenUser.startValidity
&&
inputDate <= chosenUser.EndValidity
)
]]>
</param>
<message>
<![CDATA[Input Date must be included in the User Validity interval
(from ${chosenUser.startValidity} to ${chosenUser.endValidity} )
]]>
</message>
</field-validator>
</field>
其中chosenUser
是来自 Action ( public User getChosenUser()
) 的 User 对象,startValidity 和 endValidity 是 User 对象 ( public Date getEndValidity()
) 的属性。
如您所见,动态读取也可以在消息中执行……这就是表达式验证器的强大之处;)