Hi, please review https://issues.apache.org/jira/browse/MYFACES-2920
1) JavaDoc explicitly mentions EL coecion but not Converter: https://javaserverfaces.dev.java.net/nonav/docs/2.0/javadocs/javax/faces/component/UISelectOne.html#validateValue%28javax.faces.context.FacesContext,%20java.lang.Object%29 "Before comparing each option, coerce the option value type to the type of this component's value following the Expression Language coercion rules" - but obviously if Converter was used for SelectItem.value -> String should be used for String -> SelectItem.value 2) EL coercion problem: yes, that can happen: <h:selectOne value="#{bean.floatProperty}"> <f:selectItem itemValue="" .../> Selected value will be 0.0 in this case. This is probably not problem if property is primitive float but with Object Float user expects null (maybe). But is itemValue="" permitted at all? 3) Trinidad: Matthias, isn't this change related to this problem too? : http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SimpleSelectOneRenderer.java?r1=672549&r2=694485&diff_format=h Regards, Kočičák Martin Marinschek píše v Pá 27. 08. 2010 v 17:50 +0200: > I didn't totally think through if it is usable in this case, but more > general, if you can prevent it, do not use EL coercion. Why? > > As specified, EL coercion will coerce null to 0 or an "". For the next > version of the EL, this behaviour might be configurable. > > best regards, > > Martin > > On 8/27/10, Jakob Korherr <[email protected]> wrote: > > Hi, > > > > Hmm, could be. I guess this code was introduced in JSF 1.1 (no unified EL > > and thus no EL coercion available) and never changed in later versions. > > > > If you can make the scenario work using EL coercion, please file an issue in > > the JIRA. Thanks! > > > > Regards, > > Jakob > > > > 2010/8/27 Martin Koci <[email protected]> > > > >> Hi, > >> > >> > >> I understand that requirement but isn't it EL coercion task ? : > >> > >> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=152 > >> > >> and from UISelectMany.validateValue JavaDoc: > >> > >> " ...Before comparing each option, coerce the option value type to the > >> type of this component's value following the Expression Language > >> coercion rules ..." > >> > >> > >> Regards, > >> > >> Martin Kočí > >> > >> Jakob Korherr píše v Pá 27. 08. 2010 v 15:31 +0200: > >> > Hi Martin, > >> > > >> > The purpose of this conversion is that the value of the SelectItems > >> > may be a String, but the real (already converted) value of the > >> > UISelectMany may be something else, e.g. Float. Imagine the following > >> > scenario: > >> > > >> > <h:selectManyCheckbox value="#{myBean.inputFloatArray}"> > >> > <f:selectItem itemValue="1.1" /> > >> > <f:selectItem itemValue="1.2" /> > >> > <f:selectItem itemValue="1.3" /> > >> > </h:selectManyCheckbox> > >> > > >> > The itemValues of all SelectItems are Strings, but the UISelectMany > >> > points to a property which is of type Float[]. Now because of the fact > >> > that all Strings can be converted into Floats, this scenario must > >> > work. > >> > > >> > If you now take a look at _SelectItemsUtil.matchValue(), you can see > >> > that not the component's value, but the value of the SelectItem is > >> > converted via the _ValueConverter: > >> > > >> > SelectItem item = selectItemsIter.next(); > >> > Object itemValue = item.getValue(); > >> > if(converter != null && itemValue instanceof String) > >> > { > >> > itemValue = converter.getConvertedValue(context, > >> > (String)itemValue); > >> > } > >> > > >> > and then matched against the real value (again which is e.g. Float): > >> > > >> > if (value==itemValue || value.equals(itemValue)) > >> > { > >> > return true; > >> > } > >> > > >> > Furthermore the converter has to be invoked with the wrapped String in > >> > a String[], because UISelectMany.getConvertedValue() needs a > >> > submittedValue of type String[]. > >> > > >> > Is this clear for you or should I explain it in more detail? > >> > > >> > Regards, > >> > Jakob > >> > > >> > 2010/8/27 Martin Koci <[email protected]> > >> > Hi, > >> > > >> > > >> > what is the purpose of _SelectItemsUtil._ValueConverter in > >> > UISelectMany.validateValue(FacesContext, Object) ? > >> > > >> > Two weird things: > >> > > >> > 1) it wraps value into new String[] { value } > >> > 2) it calls UISelectMany.this.getConvertedValue and it leads > >> > to > >> > Rendered.getConvertedValue call > >> > > >> > I don't see sence in call of > >> > UISelectMany.this.getConvertedValue > >> > because this already done: we are in method validateValue here > >> > and > >> > conversion with Renderer.getConvertedValue is done already. > >> > This causes > >> > calls to Renderer.getConvertedValue during process validation > >> > which is > >> > unintented I think. > >> > > >> > > >> > Regards, > >> > > >> > Martin Kočí > >> > > >> > > >> > > >> > > >> > > >> > -- > >> > Jakob Korherr > >> > > >> > blog: http://www.jakobk.com > >> > twitter: http://twitter.com/jakobkorherr > >> > work: http://www.irian.at > >> > >> > >> > > > > > > -- > > Jakob Korherr > > > > blog: http://www.jakobk.com > > twitter: http://twitter.com/jakobkorherr > > work: http://www.irian.at > > > > > -- > > http://www.irian.at > > Your JSF powerhouse - > JSF Consulting, Development and > Courses in English and German > > Professional Support for Apache MyFaces >
