我有一个页面,其输入文本组件标记为required="true"
,并且在服务器端具有自定义Validator
。
现在作为客户端,我提交的页面没有该组件呈现的HTML元素(这可以通过使用浏览器的内置DOM元素检查器从DOM树中删除元素来轻松实现)。表单已成功提交,无需服务器端验证此必需组件。
这是按照JSF规范吗?有没有办法指定即使发布的页面不包含页面中的验证器也会被执行?
答案 0 :(得分:7)
这确实符合规范。这是UIInput#validate()
javadoc(强调我的)的相关摘录:
使用
getSubmittedValue()
检索提交的值。如果返回null
,并且ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE
context-param的值为true(忽略大小写),请检查" required"的值。属性。如果"值为"是的,继续如下。如果"值为"为false或未设置required属性,退出而不进行进一步处理。如果未设置context-param,或者设置为false(忽略大小写),则退出而不进行进一步处理。 (这表示没有为此组件提交任何值。)
空输入将发送空字符串,而不是null
。完全没有输入将发送null
,而不是空字符串。
您可以通过添加以下上下文参数来禁用观察到的行为:
<context-param>
<param-name>javax.faces.ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE</param-name>
<param-value>true</param-value>
</context-param>
请注意,此上下文参数自JSF 2.3以来是新的,并且已向后移植到Mojarra 2.2.16,2.1.29-10和1.2_15-06。旧版本不支持它。另请参阅JSFSPEC-1433和the expert group discussion about this issue。
这是否有害取决于业务逻辑。一个设计得很好的模型(业务逻辑和/或数据模型),它不会将null
视为预期的情况,会导致其他地方出现空指针异常,或者导致SQL约束违规(NOT NULL
),通常会以HTTP 500错误响应结束。但如果模型实际上将null
视为预期的情况,那么它可能是模型中的错误。只想呈现模型的视图(JSF页面)可以对它做一点反对。
如果真的不能改变业务逻辑或数据模型以将null
视为例外情况(即从不假设/接受给定值为null
),并且您碰巧使用JPA,那么您最好的选择是在酒店添加@NotNull
。虽然JSF将绕过它的验证,但JPA仍将对其进行验证,导致仍然存在异常和HTTP 500错误。在这种情况下,我只想知道为什么DB列首先没有NOT NULL
约束。或者,执行class level validation。
注意到MyFaces应该在下面记录如下警告:
2016年3月16日上午8:55:52 org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
警告:如果输入已呈现,其表单已提交,并且最初未呈现为禁用或只读,则应始终为输入提交值。通过javascript禁用输入元素后,您无法提交表单。考虑将只读设置为true,或者在表单提交之前将禁用值重置为false 组件:{Component-Path:[Class:javax.faces.component.UIViewRoot,ViewId:/test.xhtml][Class:javax.faces.component.html.HtmlBody,Id:j_id_5] [Class:javax.faces.component .html.HtmlForm,Id:j_id_6] [类:javax.faces.component.html.HtmlInputText,Id:j_id_7]位置:/ test.xhtml第22行和第33列}