如何检查自定义验证器中的文件上载控件

时间:2014-03-19 13:16:13

标签: java validation xpages

我在Java上创建了一个自定义验证程序,我在XPage上使用它。所有数据都绑定到托管bean(包括主数据实体的“子”数据集 - 行)。在我的验证方法中,我检查行组件(并找到它的一些“兄弟姐妹”,以检查如果一个被填充,另一个也必须被填充或其值在一定的间隔内)。这适用于普通字段(选择,输入和复选框)。

但是如何才能获得文件上传控件?如果选中同一行中的复选框,则必须附加图片。这是我的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>

我认为手头有两个问题:

  1. 如何触发“必需”服务器端。我已经通过将字段设置为必需来测试了这一点。工作正常客户端 - 但不会触发服务器端...但是,如果填写了一个值(即选择了一个文件),我的validate方法被调用,我可以将值读入com.ibm.xsp.http .UploadedFile变量并得到例如客户端文件名(getClientFileName())。

  2. 在发现已选中复选框时获取文件上传控件 - 并测试文件上传控件是否在其中指定了任何文件...

  3. 我可以找到正确的控件作为UIComponent并获取com.ibm.xsp.component.UIFileuploadEx.UploadedFile对象。请参阅以下代码段:

    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;
    

    奇怪的是,当我选中框并附加文件时 - 上面的代码将找不到文件 - 并且验证器返回错误。文件上传控件上显示的文件名现已消失。但是,如果我再次保存而不更改任何内容,那么代码段中的文件控件现在可以正确找到该文件 - 因此不会抛出验证错误并且文件正确上传...

    如果只有我可以触发“必需”验证,我想我可以避免其他“黑客”,其中显然发生了两个拯救之间的“中间”。

    有关如何正确控制这个问题的任何想法?

    /约翰

1 个答案:

答案 0 :(得分:0)

解决方法是向每一行添加隐藏的输入字段。此字段的必需属性取决于复选框和文件上载控件:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.data>
        <xp:dominoDocument var="document1" formName="RTItem" action="editDocument" concurrencyMode="force" />
    </xp:this.data>

    <xp:repeat id="repeatFiles" rows="30" var="row" value="#{javascript:['A','B','C','D','E','F'];}">
        <xp:checkBox text="File?" id="checkBoxFile" checkedValue="1" uncheckedValue="0" />
        <xp:fileUpload  id="fileUpload" value="#{document1[row]}" />
        <xp:inputHidden id="inputHiddenFileHelper">
            <xp:this.required>
                <![CDATA[#{javascript:
                    var cmpCheck = getComponent( "checkBoxFile" );
                    var cmpFile = getComponent( "fileUpload" );

                    if( cmpCheck.value == "0" )
                        return false;

                    if( cmpFile.getValue() == null )
                        return true;
                }]]>
            </xp:this.required>
        </xp:inputHidden>
        <xp:br />
    </xp:repeat>

    <xp:messages id="messages1" />

    <!-- a button to refresh the page -->
    <xp:button value="Submit" id="buttonRefreshMe">
            <xp:eventHandler event="onclick" submit="true" immediate="false" save="true"/>
    </xp:button>

</xp:view>