2013-07-21 24 views
5

我有一个页面,输入文本组件标记为required="true",并在服务器端有一个自定义的Validator在客户端中删除输入时,验证程序会跳过 - 按照JSF规范进行验证?

现在作为客户端,我提交没有该组件呈现的HTML元素的页面(这可以通过使用浏览器的内置DOM元素检查器从DOM树中移除元素来轻松实现)。表单已成功提交,没有服务器端验证此必需组件。

这是按照JSF规范吗?有没有一种方法可以指定页面中的验证器即使被发布的页面不包含它们也将被执行?

回答

4

这是根据规范。以下是UIInput#validate() javadoc的相关摘录:

getSubmittedValue()检索提交的值。如果这返回null,退出没有进一步处理。 (这表示没有提交此组件的值。)

空输入将发送空字符串,而不是null。完全没有输入将发送null,而不是空字符串。

这是否有害取决于业务逻辑。一个设计不当的模型(业务逻辑和/或数据模型)不会像预期的那样考虑null会导致其他地方出现空指针异常或SQL约束冲突(NOT NULL),这通常会导致HTTP 500错误响应。但如果模型实际上认为null是一个预期的情况,那么它可能是模型中的一个错误。这个视图(JSF页面)只是为了展示模型,然后可以对它做很少的事情。

如果业务逻辑或数据模型可以真的不被改变,以考虑null作为一个特殊的情况下(即从不假定/接受给定值作为null),你碰巧使用JPA,那么最好的办法是增加该物业为@NotNull。虽然JSF将绕过对其的验证,但JPA仍然会对其进行验证,导致仍然存在异常和HTTP 500错误。在这种情况下,我只想知道为什么数据库列首先没有NOT NULL约束。或者,做class level validation

注意到应该是MyFaces的记录本上象下面这样的警告:

2016年3月16日上午08点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] [Class:javax.faces.component.html.HtmlInputText,Id:j_id_7]位置:/test.xhtml,位于第22行和第33列}

+0

Thanks for provide the javadoc提取物,它解释了非常清楚的行为。正如您所提到的那样,它造成的危害取决于业务逻辑:可能会在空指针异常之前部分更新应用程序作用域对象,从而导致整个应用程序崩溃。 您是否也可以回答问题的第二部分:即使输入为空,是否可以验证验证? – mittal

+0

不是没有黑客JSF。如果你碰巧使用了OmniFaces,最好的办法是通过''强制BV(JSR303 Bean验证;'@ NotNull'和朋友)支持类级bean验证。 – BalusC