Я посмотрел исходный код NumberConverter для JSF 2.2 и 2.3 и не заметил серьезных отличий (только комментарии, авторские права и т. Д.).Я выделил код, который выполняет фактическое преобразование, и выделил его в некотором очень маленьком простом Java-коде.
NumberFormat nf = NumberFormat.getNumberInstance(Locale.getDefault());
System.out.println(nf.getClass());
System.out.println(Double.class.isAssignableFrom(BigDecimal.class));
System.out.println(nf.parse("10,0")+ " : " + nf.parse("10,0").getClass());
System.out.println(nf.parse("10,1")+ " : " + nf.parse("10,1").getClass());
System.out.println(nf.parse("10.0")+ " : " + nf.parse("10.0").getClass());
System.out.println(nf.parse("10.1")+ " : " + nf.parse("10.1").getClass());
Что приводит к следующему выводу.
class java.text.DecimalFormat
false
100 : class java.lang.Long
101 : class java.lang.Long
10 : class java.lang.Long
10.1 : class java.lang.Double
Сначала я запустил это на JDK 8, но позже попробовал 7, оба с одинаковыми результатами.
Так что я склонен сделать вывод, что это не JSF, что вызывает проблемы (хотя я бы сказал, что, поскольку конвертер использует ожидаемый тип для некоторой проверки , он будетне странно возвращать ожидаемый тип, а не тип, возвращаемый NumberFormat.
Но при установке parseBigDecimal в значение true
((DecimalFormat)nf).setParseBigDecimal(true);
И при запуске тех же «тестов», нетпотеря в прецизионности , как упомянуто в конвертере , а выход
100 : class java.math.BigDecimal
101 : class java.math.BigDecimal
10.0 : class java.math.BigDecimal
10.1 : class java.math.BigDecimal
Но это также не может быть приведено к Double. Поэтому я лично начну изучать код BeanValidator.