Questa domanda è simile a:
jsf: la proprietà intera associata a un testo di input nell’interfaccia utente è impostata su zero in invio
ma non sono completamente soddisfatto della soluzione. I contesti sono gli stessi: ho un modulo web che richiede un valore intero. Se la casella di testo è vuota, voglio che il mio campo Integer sia ‘null’, ma invece il parser EL imposta automaticamente il mio campo id su ‘0’.
Posso risolvere il problema impostando un parametro JVM nella mia macchina virtuale Tomcat locale:
-Dorg.apache.el.parser.COERCE_TO_ZERO = false
- Incoraggiare la JVM in GC piuttosto che far crescere l'heap?
- Differenza tra _JAVA_OPTIONS JAVA_TOOL_OPTIONS e JAVA_OPTS
- Eseguire il debug di un'applicazione java senza avviare JVM con argomenti di debug
- aumentare la dimensione dell'heap java in modo permanente?
- Errore di overflow dello stack Java: come aumentare le dimensioni dello stack in Eclipse?
Tuttavia, questo non funzionerà per la macchina del nostro cliente. È ansible impostare / modificare questo parametro JVM “in-code”.
Aggiornamento: ho trovato che questo è stato richiesto ma se qualcun altro ha qualche altra soluzione, mi piacerebbe sentire anche questo.
https://issues.apache.org/bugzilla/show_bug.cgi?id=48813
Aggiornamento 2: Non riesco a cambiare il valore da “0” a “null” perché la mia applicazione dovrebbe considerare “0” come un vero e proprio ID. Quindi ho bisogno di sapere in fase di esecuzione se la casella di testo id è stata lasciata vuota o meno.
È ansible impostare le proprietà di sistema a livello di programmazione utilizzando System#setProperty()
.
System.setProperty("org.apache.el.parser.COERCE_TO_ZERO", "false");
Tuttavia, è necessario assicurarsi che questo sia stato impostato prima che JSF / EL venga inizializzato. Il posto migliore sarebbe un 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) { // NOOP } }
Registralo come
in web.xml
, o quando sei già su Servlet 3.0 (Tomcat 7 e così via), con annotazione @WebListener
.