Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将验证器指定为自定义控件的属性_Java_Validation_Custom Controls_Xpages - Fatal编程技术网

Java 如何将验证器指定为自定义控件的属性

Java 如何将验证器指定为自定义控件的属性,java,validation,custom-controls,xpages,Java,Validation,Custom Controls,Xpages,我正在构建一个自定义控件来格式化用于引导的输入控件。我验证数据的方式是,我有一个带有验证方法(遵循验证程序的方法签名)的bean。但是,我找不到通过自定义控件属性指定验证器的方法 这是“正常”输入文本控件: <xp:inputText xp:key="inputControl" id="inputCity" value="#{User.user.city}" validator="#{User.validate}"> <xp:this.attrs>

我正在构建一个自定义控件来格式化用于引导的输入控件。我验证数据的方式是,我有一个带有验证方法(遵循验证程序的方法签名)的bean。但是,我找不到通过自定义控件属性指定验证器的方法

这是“正常”输入文本控件:

<xp:inputText xp:key="inputControl" id="inputCity" value="#{User.user.city}"
    validator="#{User.validate}">
    <xp:this.attrs>
        <xp:attr name="placeholder" value="Enter city"></xp:attr>
    </xp:this.attrs>
            <xp:this.validators>
                <xp:validateRequired message="You must enter a city"></xp:validateRequired>
            </xp:this.validators>
</xp:inputText>
所以很明显,自定义控件试图将其作为属性读取(通过隐式“getter”)

有什么想法吗

编辑:

好的,在编写了Toby示例之后,我尝试将bean注册为faces-config.xml中的验证器,并给它一个id。在某种程度上,这似乎是可行的

在自定义控件中,我删除了“validator”属性,并在attrs下添加了一个“validator”:

<xp:validator validatorId="${compositeData.validatorId}"></xp:validator>
这可能与以下事实直接相关:compositeData.validatorId现在在另一个CC的方面内的inputText中被引用。请注意,我将“validateRequired”消息更改为字符串文字。所以,当我在没有输入任何内容的情况下进行测试时,它会给我这个消息。如果我只输入一个字符,它会调用验证器-或者尝试,因为会引发异常…:-(

有什么想法吗?这严重影响了自定义控件的使用-除非我完全错了


/John

您可以尝试在xp:validator-validator中使用验证器ID

面配置

  <validator>
    <validator-id>val</validator-id>
    <validator-class>com.tobysamples.validators.user</validator-class>
</validator>

瓦尔
com.tobysamples.validators.user
自定义控件

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputText>
        <xp:this.validators>
            <xp:validator validatorId="${compositeData.val}"></xp:validator>
        </xp:this.validators></xp:inputText>
</xp:view>

Xpage


自定义控件定义

<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
  <faces-config-extension>
    <namespace-uri>http://www.ibm.com/xsp/custom</namespace-uri>
    <default-prefix>xc</default-prefix>
  </faces-config-extension>
  <composite-component>
    <component-type>inputfield</component-type>
    <composite-name>inputfield</composite-name>
    <composite-file>/inputfield.xsp</composite-file>
    <composite-extension>
      <designer-extension>
        <in-palette>true</in-palette>
      </designer-extension>
    </composite-extension>
    <property>
      <property-name>val</property-name>
      <property-class>string</property-class>
      <display-name>val</display-name>
      <property-extension>
        <designer-extension>
          <editor>com.ibm.std.String</editor>
        </designer-extension>
      </property-extension>
    </property>
  </composite-component>
</faces-config>

http://www.ibm.com/xsp/custom
xc
输入字段
输入字段
/inputfield.xsp
真的
瓦尔
一串
瓦尔
com.ibm.std.String
新的第二个CC

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">
<xc:field val2="${compositeData.val}">
    <xp:this.facets>
    <xp:inputText xp:key="inputControl">
        <xp:this.validators>
            <xp:validator validatorId="${compositeData.val2}"></xp:validator>
        </xp:this.validators></xp:inputText>
        </xp:this.facets>
        </xc:field>
</xp:view>


Hi Toby.正如我刚才在编辑中所写的那样,validtorId可以工作。但是,当在自定义控件中使用时,它不会工作-使用另一个具有可编辑区域的自定义控件-并且inputText被放置在其中。我甚至尝试剪切所有其他属性…好的,所以您需要将信息传递两次,一次从xpage传递到第一个CC,然后从f第一次抄送到第二次抄送,即使在第一次抄送中声明了刻面内的内容,但它实际上是在第二次抄送的上下文中运行的…所以我的上下文是错误的?我还需要声明第二次抄送的属性…好的,这就解释了。我会尝试一下!你绝对正确!!感谢你的洞察力;-)
<xp:label value="#{compositeData.label}" for="#{compositeData.inputField}"></xp:label>
<xp:div styleClass="col-sm-6">
    <xp:callback facetName="inputControl" id="callback1"></xp:callback>
</xp:div>
<xc:fieldLayout label="#{compositeData.label}" inputField="inputText1">
    <xp:this.facets>
        <xp:inputText xp:key="inputControl" type="text" id="inputText1" value="#{compositeData.dataSource[compositeData.fieldName]}"
            required="${compositeData.required}" disableClientSideValidation="true">
            <xp:this.attrs>
                <xp:attr name="placeHolder" value="${compositeData.placeHolder}"></xp:attr>
            </xp:this.attrs>
            <xp:this.validators>
                <xp:validator validatorId="${compositeData.validatorId}"></xp:validator>
                <xp:validateRequired message="You must enter something"></xp:validateRequired>
            </xp:this.validators>
        </xp:inputText>
        <xp:message id="message1" for="inputText1"></xp:message>
    </xp:this.facets>
</xc:fieldLayout>
Caused by: java.lang.NullPointerException: Argument Error: One or more parameters are null. validatorId null
    at com.sun.faces.application.ApplicationImpl.createValidator(ApplicationImpl.java:630)
    at com.ibm.xsp.application.ApplicationExImpl.createValidator(ApplicationExImpl.java:1161)
    at com.ibm.xsp.validator.ValidatorImpl.getValidator(ValidatorImpl.java:75)
    at com.ibm.xsp.validator.ValidatorImpl.validate(ValidatorImpl.java:48)
    at javax.faces.component.UIInput.validateValue(UIInput.java:828)
  <validator>
    <validator-id>val</validator-id>
    <validator-class>com.tobysamples.validators.user</validator-class>
</validator>
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputText>
        <xp:this.validators>
            <xp:validator validatorId="${compositeData.val}"></xp:validator>
        </xp:this.validators></xp:inputText>
</xp:view>
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xc="http://www.ibm.com/xsp/custom">

    <xc:inputfield val="val">
    </xc:inputfield>
    <xp:br></xp:br>
    <xp:br></xp:br>
    <xp:button value="Label" id="button1">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete">
        </xp:eventHandler></xp:button></xp:view>
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
  <faces-config-extension>
    <namespace-uri>http://www.ibm.com/xsp/custom</namespace-uri>
    <default-prefix>xc</default-prefix>
  </faces-config-extension>
  <composite-component>
    <component-type>inputfield</component-type>
    <composite-name>inputfield</composite-name>
    <composite-file>/inputfield.xsp</composite-file>
    <composite-extension>
      <designer-extension>
        <in-palette>true</in-palette>
      </designer-extension>
    </composite-extension>
    <property>
      <property-name>val</property-name>
      <property-class>string</property-class>
      <display-name>val</display-name>
      <property-extension>
        <designer-extension>
          <editor>com.ibm.std.String</editor>
        </designer-extension>
      </property-extension>
    </property>
  </composite-component>
</faces-config>
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">
<xc:field val2="${compositeData.val}">
    <xp:this.facets>
    <xp:inputText xp:key="inputControl">
        <xp:this.validators>
            <xp:validator validatorId="${compositeData.val2}"></xp:validator>
        </xp:this.validators></xp:inputText>
        </xp:this.facets>
        </xc:field>
</xp:view>