1

,當我有兩個字段驗證沒有複合的工作如下驗證複合使用java.lang.Double中值

public class DoubleMustBeGreaterThanSecondDouble implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     Double firstDouble = (Double) value; 
     Double secondDouble = (Double) component.getAttributes().get("secondDouble"); 

     if (firstDouble <= secondDouble) { 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, null, null); 
      throw new ValidatorException(msg); 
     } 
    } 
} 
<p:inputText size="5" 
    validatorMessage="Plate maximum thickness must exceed plate minimum thickness" 
    value="#{calculator.boltAnalysis.plate1.maximum_thickness}"> 
       <f:validator 
        validatorId="doubleMustBeGreaterThanSecondDouble" /> 
       <f:attribute name="secondDouble" 
        value="#{calculator.boltAnalysis.plate1.minimum_thickness}" />                                 
    <p:ajax event="change" update="@this" /> 
</p:inputText> 

但轉化爲複合後,我得到java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double:上拋出ClassCastException異常只是

Double firstDouble = (Double) value;,而不是在

Double secondDouble = (Double) component.getAttributes().get("secondDouble");

這裏是作爲複合

<p:inputText size="5" 
    validatorMessage="Plate maximum thickness must exceed plate minimum thickness" 
    value="#{cc.attrs.plateMaximumThickness}"> 
       <f:validator 
        validatorId="doubleMustBeGreaterThanSecondDouble" /> 
       <f:attribute name="secondDouble" 
        value="#{cc.attrs.plateMinimumThickness}" />                                 
    <p:ajax event="change" update="@this" /> 
</p:inputText> 
<stk:plate 
     plateLabel="3" 
     plateMinimumThickness="#{calculator.boltAnalysis.plate3.minimum_thickness}" 
     plateMaximumThickness="#{calculator.boltAnalysis.plate3.maximum_thickness}" 
    /> 

這是不可思議的是一個價值過來的字符串,另一個爲double。我是否只需更改爲Double firstDouble = Double.parseDouble(value);即可,而不用擔心爲什麼component.getAttributes()仍然作爲double(Java Bean中的屬性的實際類型)傳遞給驗證程序,即使複合材料看起來與這兩個字段相同去繼續前進?

編輯

這是我的複合接口。即使在指定類型後,我仍然得到了類演員例外

<composite:interface> 
    <composite:attribute name="plateLabel" /> 
    <composite:attribute name="plateMinimumThickness" type="java.lang.Double" /> 
    <composite:attribute name="plateMaximumThickness" type="java.lang.Double" /> 
</composite:interface> 

<composite:implementation> 
    ... 
+0

問題中缺少此信息,但是您是否在<''中顯式指定了複合屬性中的值類型? – BalusC

+0

起初沒有,但後來我試了一下。 。看到你已經完全合格,看起來像我需要接下來嘗試。 – jeff

+0

@BalusC在我的界面中指定type =「java.lang.Double」不起作用。應該是? – jeff

回答

1

我無法重現您的問題。它適用於Tomcat 8.0.21上的Mojarra 2.2.10,即使沒有明確的type屬性<cc:attribute type="java.lang.Double">

作爲一種變通方法,你可以明確地在複合材料的輸入組件,下面宣佈一個轉換器:

<p:inputText ... converter="javax.faces.Double"> 

但鑽嘴魚科2.1.7是真的老了(2012年2月)。您應該考慮升級到最新的2.1.x版本,該版本目前爲2.1.29(2014年7月)或甚至2.2.x.你可以在這個答案中找到JBoss服務器Mojarra升級說明:Upgrade JSF/Mojarra in JBoss AS/EAP/WildFly