I was asked to create a control that would allow users to select the number of rows per page in a view/repeat control (the application uses both). It seemed simple at first, but I ran into a few issues that I thought I'd share the solutions to.
First, lets start at the beginning. I went through the relevant design elements and set row="#{viewScope.tableRows}", and I created an xp:comboBox with value="#{viewScope.tableRows}" and added items for 20, 30, 50, and 100, and I assigned it an onChange event handler that did a partial execution and partial refresh of a div containing the combo box, pager and the table. Then I started fixing all the problems.
First, lets start at the beginning. I went through the relevant design elements and set row="#{viewScope.tableRows}", and I created an xp:comboBox with value="#{viewScope.tableRows}" and added items for 20, 30, 50, and 100, and I assigned it an onChange event handler that did a partial execution and partial refresh of a div containing the combo box, pager and the table. Then I started fixing all the problems.
Problem 1: The combobox value was a string, but the rows parameter requires an integer. This was causing IllegalArgumentException / java.lang.String incompatible with java.lang.Integer.
I added a NumberConverter, but this only slightly changed the exception message to java.lang.Long incompatible with java.lang.Integer. So I created a very simple custom converter:
public class IntegerConverter implements Converter {
We then add this converter to faces-config.xml
public Object getAsObject(final FacesContext facesContext, final UIComponent component, final String valueString) {
public Object getAsString(final FacesContext facesContext, final UIComponent component, final Object valueObj) {
Integer i = null;
try {
return i;
} try {
i = Integer.parseInt(valueString);
} catch (Exception e) {
// error handling
} return i;
public Object getAsString(final FacesContext facesContext, final UIComponent component, final Object valueObj) {
String s = null;
try {
return s;
}
try {
i = String.valueOf(valueObj);
} catch (Exception e) {
// error handling
} return s;
<converter>
And finally we add the converter to the comboBox
<converter-id>org.common.xsp.IntegerConverter</converter-id>
<converter-class>org.package.name.IntetgerConverter<converter-class>
</converter>
<converter-class>org.package.name.IntetgerConverter<converter-class>
<xp:this.converter>
Success!! Although I did get some warnings about maybe I should calculate the selectItem values, which I ignored until...<xp:converter converterId="org.common.xsp.IntegerConverter" />
</xp:this.converter>
Comments
Post a Comment