JSF 2.0: h: inputText внутри составного компонента завершается ошибкой с объектами, не являющимися строковыми, когда задана проверка - PullRequest
2 голосов
/ 09 февраля 2011

В бобе поддержки:

@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 Ответ

1 голос
/ 12 августа 2011

Согласно комментарию к вашему билету , оказывается, что вы можете в качестве обходного пути явно указать конвертер типов.

Вы можете сделать это следующим образом

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...