【问题标题】:JSF 2.0: h:inputText inside composite component fails with non-String objects when validation is setJSF 2.0:设置验证时,复合组件内的 h:inputText 因非字符串对象而失败
【发布时间】:2011-06-24 00:43:27
【问题描述】:

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

【问题讨论】:

  • 你总是遇到最奇怪的问题。以前也没有见过这个。哪个 JSF 实现/版本?哪个 JSR303 实现/版本?这两个异常的第一个堆栈跟踪行是什么?
  • 幸运的是,SO 的好心人总是在那里提供帮助 :) 仍在运行 Mojarra 2.0.2,但我也在最新的 2.0.4 和 2.1.0 测试版上进行了尝试。我将在问题中添加几行堆栈跟踪行...
  • 我在 Mojarra 跟踪器中为此打开了一张票:java.net/jira/browse/JAVASERVERFACES-1953

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


【解决方案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>

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2015-03-17
    • 2014-07-22
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多