如何通过编程设置-Dorg.apache.el.parser.COERCE_TO_ZERO=false

25
这个问题与以下问题相似: jsf:在UI中绑定到inputtext的整数属性在提交时设置为零 但我对解决方案不完全满意。上下文是相同的:我有一个需要整数值的Web表单。如果文本框为空,我希望我的整数字段为“null”,但是EL解析器会自动将我的ID字段设置为“0”。
我可以通过在本地Tomcat VM中设置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文本框是否为空。

1个回答

48

您可以使用 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注释。


这是使网络应用程序更兼容、将配置保持在内部使其更容易的好方法! - Alexandre Lavoie
@AlexandreLavoie,这也是使Web应用程序不太兼容的好方法,因为System#setProperty会影响整个JVM! - Vsevolod Golovanov
@这个词用错了,我想说的是_portable_,无论何时使用整数或长整数,使用null而不是0是一个好习惯。 - Alexandre Lavoie
1
@Rafael:这是一篇非常好的文章(由我的同事撰写 :))。我们确实在一个遗留的JSF 1.2生产系统中以这种方式应用它,这个系统需要进行太多的测试和更改。如果从一开始就设置好了,那就更好了。 - BalusC
感谢您的回答和@WebListener注释。 - MilanPanchal
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接