使用 java.lang.Double 值时复合中的验证器抛出 ClassCastException

Validator in composite throws ClassCastException when using java.lang.Double value

我有一个没有复合的双字段验证器,如下所示

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:

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}" 
     />

奇怪的是,一个值作为 String 而另一个作为 Double。我是否只是将我的第一个双精度更改为 Double firstDouble = Double.parseDouble(value); 而不必担心为什么 component.getAttributes() 仍然作为双精度传递给验证器(Java Bean 中属性的实际类型)甚至尽管就这两个领域而言,复合材料看起来是一样的,只是继续前进?

编辑

这是我的复合界面。即使在指定类型之后,我仍然得到 class cast exception

<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>
   ...

我无法重现你的问题。它适用于 Tomcat 8.0.21 上的 Mojarra 2.2.10,即使 <cc:attribute type="java.lang.Double"> 中没有明确的 type 属性。

作为解决方法,您可以在复合的输入组件中显式声明如下转换器:

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

但是 Mojarra 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.