Problems with pe:inputNumber + Lists

Community Driven Extensions Project
Post Reply
nagelfar
Posts: 4
Joined: 14 May 2014, 11:48

12 Mar 2015, 15:19

If I use a single property in the Controller (Name: bigDecimal) and a pe:inputNumber to display and change it everything works fine.

If I try the same with a List<BigDecimal> or a Map<BigDecimal> the numbers get displayed just fine but updates never happen, the value gets set to null. (I can see the set Method of the e.g. List being called with the correct index even but the value is set to null).

Am I doing something obviously wrong here?

The StringList and StringMap is just for comparison.

We are running on PF 5.1.7, PF Extensions 3.0.0 and Mojarra. Tomcat 8.0

Testpage:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui"
	xmlns:pe="http://primefaces.org/ui/extensions">

<f:view contentType="text/html">



	<h:head>
		<title>InputNumber Problem</title>
	</h:head>
	<h:body>
		<h:form>
		<p:outputPanel>
			Single Number <br/>
			<pe:inputNumber value="#{inputNumberController.bigDecimal}"/>
			<br/><br/>
			DoubleList<br/>
			<pe:inputNumber value="#{inputNumberController.doubleList[0]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[1]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[2]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[3]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[4]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[5]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[6]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[7]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[8]}"/>
			<pe:inputNumber value="#{inputNumberController.doubleList[9]}"/>
			<br/><br/>
			BigDecimalList<br/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[0]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[1]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[2]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[3]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[4]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[5]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[6]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[7]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[8]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalList[9]}"/>
			
			<br/><br/>
			StringList <br/>
			<p:inputText value="#{inputNumberController.stringList[0]}"/>
			<p:inputText value="#{inputNumberController.stringList[1]}"/>
			<p:inputText value="#{inputNumberController.stringList[2]}"/>
			<p:inputText value="#{inputNumberController.stringList[3]}"/>
			<p:inputText value="#{inputNumberController.stringList[4]}"/>
			<p:inputText value="#{inputNumberController.stringList[5]}"/>
			<p:inputText value="#{inputNumberController.stringList[6]}"/>
			<p:inputText value="#{inputNumberController.stringList[7]}"/>
			<p:inputText value="#{inputNumberController.stringList[8]}"/>
			<p:inputText value="#{inputNumberController.stringList[9]}"/>
			<br/><br/>
			BigDecimalMap <br/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[0]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[1]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[2]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[3]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[4]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[5]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[6]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[7]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[8]}"/>
			<pe:inputNumber value="#{inputNumberController.bigDecimalMap[9]}"/>
			<br/><br/>
			StringMap <br/>
			<p:inputText value="#{inputNumberController.bigStringMap[0]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[1]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[2]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[3]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[4]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[5]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[6]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[7]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[8]}"/>
			<p:inputText value="#{inputNumberController.bigStringMap[9]}"/>
			<br/><br/>
			<p:commandButton value="save" process="@form" update="@form" />
			<p:commandButton value="reset" process="@this" update="@form" action="#{inputNumberController.reset()}"  />
		</p:outputPanel>
		</h:form>
	</h:body>

</f:view>
</html>
Controller:

Code: Select all

package com.signonit.ym.bugs;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@SessionScoped
@ManagedBean(name = "inputNumberController")
public class InputNumberController {
	
	
	private BigDecimal bigDecimal;
	
	private List<BigDecimal> bigDecimalList;
	
	private List<String> stringList;
	
	private List<Double> doubleList;
	
	private Map<Long, BigDecimal> bigDecimalMap;
	
	private Map<Long, String> bigStringMap;
	
	public InputNumberController() {
		initOrReset();
	}

	private void initOrReset() {
		System.out.println("InputNumberController initOrReset");
		bigDecimalList = new ArrayList<BigDecimal>(10);
		bigDecimalMap = new HashMap<Long, BigDecimal>();
		bigDecimal = new BigDecimal("99.999");
		bigStringMap = new HashMap<Long, String>();
		stringList = new ArrayList<String>();
		doubleList = new ArrayList<Double>();
		for(int i = 0; i<10; i++) {
			bigDecimalList.add(new BigDecimal(i));
			bigDecimalMap.put((long)i, new BigDecimal(i));
			bigStringMap.put((long)i, new String("String: " + i));
			stringList.add(new String("String: " + i));
			doubleList.add((double)i);
		}
	}
	
	public void reset() {
		initOrReset();
	}

	public BigDecimal getBigDecimal() {
		System.out.println("getting single bigdecimal: " + bigDecimal);
		return bigDecimal;
	}

	public void setBigDecimal(BigDecimal bigDecimal) {
		this.bigDecimal = bigDecimal;
	}

	public List<BigDecimal> getBigDecimalList() {
		return bigDecimalList;
	}

	public void setBigDecimalList(List<BigDecimal> bigDecimalList) {
		this.bigDecimalList = bigDecimalList;
	}

	public Map<Long, BigDecimal> getBigDecimalMap() {
		return bigDecimalMap;
	}

	public void setBigDecimalMap(Map<Long, BigDecimal> bigDecimalMap) {
		this.bigDecimalMap = bigDecimalMap;
	}

	public Map<Long, String> getBigStringMap() {
		return bigStringMap;
	}

	public void setBigStringMap(Map<Long, String> bigStringMap) {
		this.bigStringMap = bigStringMap;
	}

	public List<String> getStringList() {
		return stringList;
	}

	public void setStringList(List<String> stringList) {
		this.stringList = stringList;
	}

	public List<Double> getDoubleList() {
		return doubleList;
	}

	public void setDoubleList(List<Double> doubleList) {
		this.doubleList = doubleList;
	}
	
	
	
	
}

myset
Posts: 10
Joined: 25 Nov 2012, 15:08

08 Jul 2015, 08:32

This issue persist in PF Extensions 3.1.0 and 3.2.0. It work in PF Extensions 2.0
Cristian Gheorghe Florescu

myset
Posts: 10
Joined: 25 Nov 2012, 15:08

08 Jul 2015, 15:52

It works in 3.1.0 and 3.2.0 when adding converter attribute

<pe:inputNumber id="mynumber"
value="#{mymap['mykey']}"
converter="javax.faces.BigDecimal" ...
Cristian Gheorghe Florescu

tandraschko
PrimeFaces Core Developer
Posts: 3979
Joined: 03 Dec 2010, 14:11
Location: Bavaria, DE
Contact:

08 Jul 2015, 17:50

Feel free to fix the issue and provide a pull request.
Thomas Andraschko

PrimeFaces | PrimeFaces Extensions

Apache Member | OpenWebBeans, DeltaSpike, MyFaces, BVal, TomEE

Sponsor me: https://github.com/sponsors/tandraschko
Blog: http://tandraschko.blogspot.de/
Twitter: https://twitter.com/TAndraschko

nagelfar
Posts: 4
Joined: 14 May 2014, 11:48

08 Jul 2015, 17:59

First of all, sry for not getting back to answer earlier.

This is not a fixable issue per se as it is the expected behaviour in JSF + EL.
JSF and its conversion don't seem to support parametrized types/generics in collections so the system doesn't know that BigDecimal should be used.

Together with the primefaces developers we came up with two possible solutions:
  • Use an array instead of list, JSF can then retrieve the type correctly
  • Define the converter explicity (as myset has correctly stated)

myset
Posts: 10
Joined: 25 Nov 2012, 15:08

09 Jul 2015, 23:07

For me it works fine using converter attribute ...
It's much more precise if you use converter attribute on latest version of PF Extensions.
No updates necessary.

Thank you all.
Cristian Gheorghe Florescu

Post Reply

Return to “Extensions”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 5 guests