JSF 2.0:h:inputText在设置验证时,复合组件内部的非字符串对象会失败

JSF 2.0:h:inputText在设置验证时,复合组件内部的非字符串对象会失败,jsf,jsf-2,facelets,bean-validation,composite-component,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> 但我得到: javax.validation.ValidationException: Unexpected exception during isValid call

在支持bean中:

@Min(3)
Integer foo;
如果我有如下表格:

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

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
,定义不同的类型(也省略了它)和一些其他技巧,但我有点不确定如何实际实现这一点。还是一只虫子?好像它忘记使用转换器了?我误解了什么吗?

根据上的一条评论,您可以明确指定类型转换器作为解决方案

你可以这样做

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


或许

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



你总是遇到最奇怪的问题。我以前也没见过这个。哪个JSF impl/版本?哪个JSR303 impl/版本?这两个异常的第一个stacktrace行是什么?幸运的是,SO的好心人总是在帮助:)仍然运行Mojarra 2.0.2,但我也在最新的2.0.4和2.1.0 Beta上尝试了这一点。我将在问题中添加几行stacktrace…我在Mojarra tracker中为此开了一张罚单:
<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>