使用 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.
我有一个没有复合的双字段验证器,如下所示
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.