Se avete utilizzato i componenti delle Java Server Faces vi sarà sicuramente capitato di dover popolare, ad esempio, una combo box (tendina) con valori di tipo intero come ad esempio quelli provenienti da un Enum Java.
1 2 3 4 5 6 |
<h:selectOneMenu value="#{myBean.allowedType}"> <f:selectItem noSelectionOption="true" itemLabel="Select One"/> <f:selectItems value="#{myBean.allowedTypes}" var="type" itemLabel="#{type.description}" itemValue="#{type}"/> <s:objectConverter/> </h:selectOneMenu> |
Facendo una ricerca su internet tra le soluzioni (spesso banali e poco pratiche) che troviamo, la più ovvia è quella dell’utilizzo dell’opzione COERCE_TO_ZERO a false. Ma come impostarla? La soluzione banale è quella di avviare il container con l’opzione -Dorg.apache.el.parser.COERCE_TO_ZERO=false ma personalmente non sono un fan di questa soluzione.
Quello che preferisco, e che quindi propongo nel post, è di utilizzare un Servlet Container Listener ovvero un oggetto (java) che viene eseguito dal servlet container prima che l’applicazione sia avviata.
1 2 3 4 5 6 7 8 |
public class CoerceToZeroListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { System.setProperty("org.apache.el.parser.COERCE_TO_ZERO", "false"); } public void contextDestroyed(ServletContextEvent event) { } } |
1 2 3 4 |
<listener> <listener-class>it.inspired.web.listener.CoerceToZeroListener</listener-class> </listener> |
1 2 3 4 5 6 |
<dependency> <groupId>it.inspiredsoft</groupId> <artifactId>web</artifactId> <version>1.0.0</version> </dependency> |