【问题标题】:How to set -Dorg.apache.el.parser.COERCE_TO_ZERO=false programmatically如何以编程方式设置 -Dorg.apache.el.parser.COERCE_TO_ZERO=false
【发布时间】:2011-07-10 15:32:54
【问题描述】:

这个问题类似于:

jsf: integer property binded to a inputtext in UI is set to zero on submit

但我对解决方案并不完全满意。上下文是相同的:我有一个需要整数值的 Web 表单。如果文本框为空,我希望我的 Integer 字段为“null”,但 EL Parser 会自动将我的 id 字段设置为“0”。

我可以通过在本地 Tomcat 虚拟机中设置 JVM 参数来解决此问题:

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

但是,这不适用于我们客户的机器。是否可以“在代码中”设置/更改此 JVM 参数。

更新:我发现有人要求这样做,但如果其他人有任何其他解决方法,我也想听听。

https://issues.apache.org/bugzilla/show_bug.cgi?id=48813

更新 2:我无法将值从“0”改回“null”,因为我的应用程序应将“0”视为实际 id。所以我需要在运行时知道 id 文本框是否为空。

【问题讨论】:

    标签: jsf tomcat el jvm-arguments managed-bean


    【解决方案1】:

    您可以使用System#setProperty() 以编程方式设置系统属性。

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

    但是,您需要确保在JSF/EL 初始化之前设置了此项。最好的地方是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
        }
    
    }
    

    web.xml 中将其注册为<listener>,或者当您已经在Servlet 3.0(Tomcat 7 等)上时,使用@WebListener 注释。

    【讨论】:

    • 这是使 Web 应用程序更兼容的好方法,保持内部配置更容易!
    • @AlexandreLavoie,这也是降低 Web 应用程序兼容性的好方法,因为 System#setProperty 会影响整个 JVM!
    • @this 错误的术语,我说的是 portable,无论如何,在玩整数或长整数时,最好使用 null 而不是 0
    • 如果这仍然影响到您并且您需要便携式解决方案,您可以查看此帖子:jdevelopment.nl/passing-null-model-jsf
    • @Rafael:那是一篇很棒的文章(我的同事写的 :))。我们确实以这种方式将它应用到了源自 JSF 1.2 的遗留生产系统中,在该系统中,在此更改之后需要进行太多测试和更改。如果从头开始设置就更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多