【发布时间】:2023-03-30 06:15:01
【问题描述】:
我在我的 XPage 上使用 Java 创建了一个自定义验证器。所有数据都绑定到托管 bean(包括主数据实体的“子”数据集 - 行)。在我的 validate 方法中,我检查行组件(并找到它的一些“兄弟”来检查一个是否被填充,另一个也必须被填充或者它的值在某个时间间隔内)。这适用于普通字段(选择、输入和复选框)。
但是我怎样才能获得文件上传控制呢?如果选中同一行中的复选框,则必须附加图片。这是我的 fileUpload 的定义:
<xp:fileUpload id="fileUploadSingle" value="#{row.photo}"
disableClientSideValidation="true" required="true">
<xp:this.validators>
<xp:validator validatorId="fishingTripValidator"></xp:validator>
<xp:validateRequired message="You must attach a photo"></xp:validateRequired>
</xp:this.validators>
</xp:fileUpload>
我认为手头有两个问题:
如何触发“必需的”服务器端。我已经通过将字段设置为必填来测试了这一点。在客户端工作正常 - 但不会触发服务器端......但是,如果填写了一个值(即选择了一个文件),我的验证方法将被调用,我可以将该值读入 com.ibm.xsp.http .UploadedFile 变量并获取例如客户端文件名 (getClientFileName())。
当发现复选框被选中时获取文件上传控件 - 并测试文件上传控件中是否指定了任何文件...
我可以找到作为 UIComponent 的正确控件并获得 com.ibm.xsp.component.UIFileuploadEx.UploadedFile 对象。看到这个sn-p:
com.ibm.xsp.component.xp.XspFileUpload fileUpload = (com.ibm.xsp.component.xp.XspFileUpload) component;
if (null != fileUpload) {
com.ibm.xsp.component.UIFileuploadEx.UploadedFile uploadedFile = (com.ibm.xsp.component.UIFileuploadEx.UploadedFile) fileUpload.getValue();
if (null != uploadedFile) {
return uploadedFile.getFilename();
}
}
return null;
奇怪的是,当我选中该框并附加文件时 - 上面的代码将找不到文件 - 并且验证器返回错误。文件上传控件上显示的文件名现已消失。但是,如果我在不更改任何内容的情况下再次保存,则代码 sn-p 中的文件控件现在可以正确找到文件 - 因此不会引发验证错误并且文件已正确上传...
如果我能触发“必需”的验证,我想我可以避免其他“黑客”,显然在两次保存“之间”发生了一些事情。
关于如何正确控制它的任何想法?
/约翰
【问题讨论】:
-
您需要将验证器放入上传控件中。在那里您可以使用“value”作为 SSJS 变量来检查控件的值。
-
我已经做到了——也许我的问题 #1 并不清楚。问题是它仅在用户添加文件名时调用 - “必需”属性在这种情况下似乎不起作用...... - 我已经编辑了我的问题以包含文件上传的定义。跨度>
-
验证器仅在有要验证的值时使用。空值(-> 无文件),无验证。
-
斯文,我明白。这就是为什么我尝试使用“必需”属性(可以计算)和 validateRequired 验证器 - 但它不会触发 fileUpload (适用于其他控件)。这就是为什么我试图“绕着热汤走”以找到另一种验证内容的方法(即我的#2问题)。
-
可能没有帮助,因为您绑定到 bean,但我遇到了同样的问题。唯一的解决方法是通过 xspDoc 检查 if( xspDoc.getAttachmentList("Attachment").isEmpty() ){ var msg = new javax.faces.application.FacesMessage("Attachment is Mandatory"); facesContext.addMessage("附件是强制性的", msg );返回假; };
标签: java validation xpages