Transmission par JSF de la valeur primitive au lieu de null

lossless-page1-320px-20110510-jsf-logo.tiff
Dans le cas d'un formulaire JSF comportant des champs de saisie numérique, lors de l'enregistrement, les données non renseignées sont enregistrées avec la valeur zéro. Dans mon cas, je souhaitais garder la valeur à null pour l'enregistrement en brouillon du formulaire et vérifier que la valeur est non null lors de la validation définitive du formulaire.
Le problème vient en fait du Parser EL qui convertit automatiquement la valeur null à 0 lors de la validation. Il s'agit d'un comportement généré par la correction d'un bug EL Tomecat 6.0.16. Après de nombreuses critiques, Apache Tomcat a introduit un nouveau paramètre dans la VM de Tomcat 6.0.17 qui permet de désactiver cette contrainte. Il suffit d'ajouter l'option suivante au fichier de configuration de Tomcat catalina.properties :
-Dorg.apache.el.parser.COERCE_TO_ZERO = False

Cependant dans certains contextes clients, les modifications de JVM ne sont pas possibles. Dans ce cas il faut ruser et modifier les propriétés systèmes en utilisant System.setProperty().

System.setProperty("org.apache.el.parser.COERCE_TO_ZERO", "false");

Il est nécessaire de s'assurer que la modification a lieu avant l'initialisation JSF/EL. Pour cela, il suffit de placer la modification dans le ServletContextListener :

package fr.test.utils;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class Config implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent event) {
    System.setProperty("org.apache.el.parser.COERCE_TO_ZERO", "false");
  }

  @Override
  public void contextDestroyed(ServletContextEvent event) {
  }

}

Et ensuite dans le web.xml, déclarer la classe Config comme listener.

<listener>
     <listener-class>fr.test.utils.Config</listener-class>
</listener>

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.