2011-02-09 42 views
2

在輔助bean:JSF 2.0:H:複合部件內的inputText失敗,非字符串對象時驗證設定

@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,定義不同類型(也省略了它)和一些其他技巧,但我有點不確定如何實際執行此操作。或者它是一個錯誤?似乎忘記使用轉換器了?我誤解了一些東西嗎?

+0

你」你可以做到這一點總是有最奇怪的問題。之前也沒有見過這個。哪個JSF impl /版本?哪個JSR303 impl /版本?這兩個異常的第一個堆棧跟蹤行是什麼? – BalusC 2011-02-09 11:45:18

+0

幸運的是,SO的善良人總是在那裏幫助:)仍然運行Mojarra 2.0.2,但我也嘗試了最新的2.0.4和2.1.0測試版。我會在這個問題上添加一些堆棧跟蹤... – 2011-02-09 16:38:08

回答

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>