JSF 2.0:h:复合组件中的inputText在设置验证时失败,并带有非String对象

时间:2011-02-09 10:19:31

标签: jsf jsf-2 facelets bean-validation composite-component

在支持bean中:

@Min(3)
Integer foo;

如果我的表格如下:

<h:form>
    <h:commandButton value="Submit" />
    <h:inputText value="#{bean.foo}" />
</h:form>

这没关系。但是,如果我做了类似

的事情
<cc:interface>
    <cc:attribute name="text" />
    <cc:editableValueHolder name="text" targets="field" />
<cc:interface>
<cc:implementation>
    <h:inputText id="field" value="#{cc.attrs.text}" />
</cc:implementation>

并在内部表单中调用此内容而不是直接h:inputText,如下所示:

<!-- <h:inputText value="#{bean.foo}" /> -->
<pref:fieldComponent text="#{bean.foo}" />

但后来我得到了:

javax.validation.ValidationException: Unexpected exception during isValid call
    at org.hibernate.validator.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:144)
    at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:118)
    at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:121)
    at org.hibernate.validator.engine.ValidatorImpl.validateValueForGroup(ValidatorImpl.java:655)
    ...

根本原因是:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number
    at org.hibernate.validator.constraints.impl.MinValidatorForNumber.isValid(MinValidatorForNumber.java:32)
    at org.hibernate.validator.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:141)
    ... 69 more

如果我删除验证,它可以工作。另外,如果foo的类型为String,则它也适用于验证。

我尝试使用cc:editableValueHolder,定义不同的类型(也省略它)和其他一些技巧,但我有点不确定如何实际实现它。或者这是一个错误?好像忘了使用转换器?我误解了什么吗?

1 个答案:

答案 0 :(得分:1)

根据对your ticket的评论,事实证明您可以通过变通方法明确指定类型转换器。

您可以按照以下方式执行此操作

<pref:fieldComponent text="#{bean.foo}">
    <f:converter converterId="javax.faces.Integer" />
</pref:fieldComponent>

<cc:implementation>
    <h:inputText id="field" value="#{cc.attrs.text}">
        <cc:insertChildren />
    </h:inputText>
</cc:implementation>

或者

<pref:fieldComponent text="#{bean.foo}" converter="javax.faces.Integer" />

<cc:implementation>
    <h:inputText id="field" value="#{cc.attrs.text}" converter="#{cc.attrs.converter}" />
</cc:implementation>