语句在WAS上提供nullPointerException但在Tomcat上运行正常

时间:2013-01-16 11:06:48

标签: java jsf-2 tomcat7 el websphere-7

这是一种奇怪的场景,我要求的是,如果有人在过去经历过类似的事情,并且有任何可能的案例提示

我正在处理的应用程序用于各种环境。我们通常使用Tomcat进行开发,其中一个集成环境是Websphere。

现在声明如

BillingPaymentAssembler.java:149

finActivity.setReferenceNo(paymentDetail.getTicketNumber());

其中ticketNumber为String,在单元测试期间可以在Tomcat上正常运行。但是当在websphere上部署时,会为同一测试用例抛出nullPointerException

更新#1

我们在UI上使用JSF2,paymentDetail是Bean。

ticket number是UI上与[{1}} bean对应的字段。

这种情况,当我没有在ticketNumber的UI上输入任何内容时,将其留空。在那种情况下,我得到了异常

更新#2

ticket number

1 个答案:

答案 0 :(得分:2)

我认为ticketNumberNumberIntegerLongDouble等的实例。通常,当使用基本类型(intlongdouble等)时,EL会自动将空字符串提交的值强制转换为基元的默认值0或{ {1}}。在包装器对象类型的情况下,EL解析器存在差异,因为EL specification对此并不十分清楚和/或因为强制转换为0.0对于空字符串提交值更有意义在非原始类型上。

Apache API解析器附带的Tomcat会将null类型上的空字符串提交值强制转换为基本表示的默认值。因此,Number类型的空提交值将设置为Integer而不是0。显然你认为这是“正确的”行为,你的代码也是这样编写的,以拦截它。

但是,在这种明显的情况下,其他服务器(例如WebSphere)会将它们强制转换为null而不是原始表示的默认值,从而导致NPE。

基本上,错误在您的代码中。如果null是“无价值”的有效表示(这取决于您的业务要求),您应该考虑null值,或者使用int代替Integer )。为了使所有服务器的行为相同,您基本上还应该指示Tomcat 强制将0上的空字符串提交值强制转换为Number。您可以通过将以下VM参数添加到Tomcat启动脚本来执行此操作:

0

请注意,此问题实质上与JSF无关。它只是使用 EL。

另见: