Java 如何将验证器指定为自定义控件的属性
我正在构建一个自定义控件来格式化用于引导的输入控件。我验证数据的方式是,我有一个带有验证方法(遵循验证程序的方法签名)的bean。但是,我找不到通过自定义控件属性指定验证器的方法 这是“正常”输入文本控件: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>
<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>