【问题标题】:NumberFormatException with custom type on primefaces's InputNumberPrimefaces 的 InputNumber 上具有自定义类型的 NumberFormatException
【发布时间】:2019-10-28 13:27:47
【问题描述】:

我使用 PrimeFaces 在 JSF 项目中创建了一种自定义类型。 我会将此类型与 PrimeFaces 的 inputNumber 一起使用,但出现错误:

NumberFormatException 类 java.lang.NumberFormatException java.lang.NumberFormatException 在 java.math.BigDecimal.(BigDecimal.java:550) 在 java.math.BigDecimal.(BigDecimal.java:383) 在 java.math.BigDecimal.(BigDecimal.java:806) 在 org.primefaces.component.inputnumber.InputNumberRenderer.formatForPlugin(InputNumberRenderer.java:292) 在 org.primefaces.component.inputnumber.InputNumberRenderer.encodeScript(InputNumberRenderer.java:231) 在 org.primefaces.component.inputnumber.InputNumberRenderer.encodeEnd(InputNumberRenderer.java:124)

简而言之,我创建了一个类MyCurrency,它存储double 并扩展ValueExpression,如下所示:

public final class MyCurrency extends ValueExpression implements Comparable<MyCurrency>, Serializable {

private Double value;

    private MyCurrency(final Double value) {
        this.value = value;
    }

    public Double getValue() {
        return this.value;
    }

    public Long longValue() {
        return value.longValue();
    }

    @Override
    public int compareTo(final MyCurrency o) {
        return this.getValue().compareTo(o.getValue());
    }

    @Override
    public Object getValue(final ELContext context) {
        return new BigDecimal(this.value);
    }

    @Override
    public void setValue(final ELContext context, final Object value) {
        this.value = new Builder().withValue(value).build().value;
    }

    public static class Builder {

        private Double value;

        public Builder withValue(final Double value) {
            this.value = value;
            return this;
        }

        public Builder withValue(final Long value) {
            this.value = new Double(value);
            return this;
        }

        public Builder withValue(final Object value) {
            this.value = Double.parseDouble(value.toString());
            return this;
        }

        public MyCurrency build() {
            return new MyCurrency(this.value);
        }

    }
}

在我的 bean 中,我有一个类型为 MyCurrency 的属性。

当我将它与 inputNumber 一起使用时:

<p:inputNumber id="importoDa" value="#{myBean.myAmount}" />

我收到错误 [NumberFormatException]

有什么帮助吗?

【问题讨论】:

  • 调试时调用formatForPlugin(String valueToRender, InputNumber inputNumber, Object value)valueToRender变量的内容是什么?它不能包含“,”作为十进制分隔符which is what you likely did。你为什么要扩展ValueExpression
  • 我找不到方法formatForPlugin,我扩展了ValueExpression,因为我认为PrimeFaces 需要ValueExpression 才能在EL 中使用它。我正在尝试将其删除...似乎正在调用toString() 以获取其值。
  • #{myBean.myAmount} is 已经是一个 valueExpression,即使字段 myAmount 只是简单的 String、Integer、Double、BigDecimal 或其他类型。您不需要扩展 ValueExpression。
  • @Selaron 如何知道 MyCurrency 类中的 value 属性是什么?谢谢。
  • #{myBean.myAmount.value} 是指向字段value 的值表达式。

标签: java jsf primefaces


【解决方案1】:

不确定这是否是您所要求的解决方案,但似乎您正在尝试将inputNumber 的输入格式化为货币并将其值与另一个对象进行比较。在 bean 中仅存储 doubleBigDecimal 值并在视图中将其格式化为货币可能更容易。您可以通过这种方式使用&lt;p:inputNumber&gt; 标记的symboldecimalPlaces 属性来实现此目的:

<p:inputNumber id="importoDa" value="#{myBean.myAmount}" symbol="$" decimalPlaces="2" />

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2011-03-20
    • 2017-04-06
    相关资源
    最近更新 更多