I got this error message on refresh:
java.lang.IllegalArgumentException: argument type mismatch
The issue turned out to be a somewhat inconsistent underlying API. When the field is empty, or has single value, it tries to set a string. When there are multiple values, it tries to set a list.
To work around the issue, have the getter return an Object, and the setter accept an object.
E.g.
public Object getInputMulti() {
return this.inputMulti;
}
...
@SuppressWarnings( "unchecked" )
public void setInputMulti( Object inputMulti ) {
if( inputMulti == null ){
this.inputMulti = null;
}
if( inputMulti instanceof String ) {
Vector inputNameList = new Vector();
inputNameList.add( (String) inputMulti );
this.inputMulti = inputNameList;
}
if( inputMulti instanceof List ) {
this.inputMulti = (Vector) inputMulti;
}
}
You can have the translation for the setter be done in a utility method. E.g.
@SuppressWarnings("unchecked")
public static Vector translateToVector( Object object ){
if( object instanceof String ){
Vector list = new Vector();
list.add( object );
return list;
}
if( object instanceof List ){
return (Vector)object;
}
return null;
}
Then, for the setter:
@SuppressWarnings( "unchecked" )
public void setInputMulti( Object inputMulti ) {
this.inputMulti = UtilityClass.translateToVector( inputMulti );
}
Example of multi value fields: Checkbox group, multi value fields (fields with multipleSeparator), list boxes.