Lavora per INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL difettoso in Mojarra JSF 2.1

So che ci sono un certo numero di post sulla conversione della stringa vuota in null in JSF2. La solita prescrizione è aggiungere quanto segue a web.xml.

 Does not appear to work javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL true  

Questo non sembra funzionare affatto. Ho quindi creato un convertitore di stringhe personalizzato per verificare se funzionasse. L’ho aggiunto esplicitamente come un convertitore al mio inputText (altrimenti non sparerà se vuoto).

Quando INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL è impostato su true, il convertitore riceve null e il setter per il testo di input riceve ancora “”.

Quando INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL è impostato su false (o commentato) il convertitore riceve “” e il setter per il testo di input riceve “” (anche dopo che il convertitore restituisce null).

 @FacesConverter(forClass=java.lang.String.class, value="emptyStringToNull") public class StringConverter implements Converter, Serializable { private static final long serialVersionUID = -1121162636180944948L; public Object getAsObject(FacesContext context, UIComponent component, String value) { if (value == null || value.trim().isEmpty()) { return null; } return value; } public String getAsString(FacesContext context, UIComponent component, Object object) { if (object == null) return null; return object.toString(); } } 

Ho provato l’evento (inutilmente) per impostare esplicitamente il valore inviato dal componente in getAsObject:

 if (component instanceof EditableValueHolder) ((EditableValueHolder) component).setSubmittedValue(null); 

Sto usando JBoss6 (un’istantanea di 6.1 in realtà) e JSF 2.1.1.

Questo non è specifico di Mojarra. Questo è specifico per Tomcat (JBoss utilizza Tomcat come servletcontainer). Aggiungere il seguente argomento VM alle opzioni di avvio.

 -Dorg.apache.el.parser.COERCE_TO_ZERO=false 

Secondo la mia esperienza, questo in realtà dovrebbe applicarsi solo alle proprietà Number (int, long, ecc.), Tuttavia dal momento che una certa versione di Tomcat 6.0.x (almeno dopo 6.0.20) sembra essere rotta anche per le stringhe e si basa sull’argomento VM precedente.

Su GlassFish 3.x ad esempio funziona perfettamente bene fuori dalla scatola.