Maybe you could try to add property "org.apache.el.parser.COERCE_TO_ZERO=false" to your JVM Denis/MTL
2014-07-16 13:00 GMT-04:00 l.pe...@senat.fr <l.pe...@senat.fr>: > Dear all, > > I just finished to struggle with the display of nullable Long or Integer > values. I am using Primefaces 5.0.1 / MyFaces 2.2.4 / OpenWebBeans 1.2.2 / > Tomcat 7.0.39. > > Those values are the result of the evaluation of EL expressions that I > create with the following function : > > public static ValueExpression createValueExpression(String expression, > Class clazz) { > FacesContext fc = FacesContext.getCurrentInstance(); > ELContext elContext = fc.getELContext(); > FacesELContext felContext = (FacesELContext)fc.getELContext(); > SenatFunctionMapper sfm = SenatFunctionMapper.getInstance(); > felContext.setFunctionMapper(sfm); > ExpressionFactory expFactory = fc.getApplication(). > getExpressionFactory(); > ValueExpression ret = null; > if(clazz==null) { > clazz = Object.class; > } > try { > ret = expFactory.createValueExpression(elContext, > expression, clazz); > } catch (ELException ex) { > log.fatal("Erreur de compilation de l'expression EL : '" + > expression + "'", ex); > } > return ret; > } > > Until now, I created those value expressions with the real expected class > as the third parameter of ExpressionFactory#createValueExpression. The > name of this parameter is "expectedType", so it seems logical to me to > provide the best information I had. So, I provided java.lang.Integer.class > or java.lang.Long.class, etc. > > But when I do that, null values are displayed as 0, either with > h:inputText (standard MyFaces control) or p:inputText (PrimeFaces version). > > The reason being that > > org.apache.el.ValueExpressionImpl#getValue > > is implemented the following way > > @Override > public Object getValue(ELContext context) throws > PropertyNotFoundException, > ELException { > EvaluationContext ctx = new EvaluationContext(context, > this.fnMapper, > this.varMapper); > Object value = this.getNode().getValue(ctx); > if (this.expectedType != null) { > return ELSupport.coerceToType(value, this.expectedType); > } > return value; > } > > and that ELSupport.coerceToType of a Long or Integer null value is defined > as... 0 > > As those type are numeric, coerceToType calls coerceToNumber, which starts > with : > > public static final Number coerceToNumber(final Object obj, > final Class<?> type) throws ELException { > if (obj == null || "".equals(obj)) { > return coerceToNumber(ZERO, type); > } > ... > } > > thus, the ZERO value. > > For the time being, I solved my «problem» by passing a null third > parameter to ExpressionFactory#createValueExpression. It works. It has no > apparent drawbacks. But I don't get the logic of it. Should'nt > ELSupport#coerceToNumber handles this differently ? > > Thanks in advance for your explanations, > > Ludovic > | > | AVANT D'IMPRIMER, PENSEZ A L'ENVIRONNEMENT. > | > >