这是一种奇怪的场景,我要求的是,如果有人在过去经历过类似的事情,并且有任何可能的案例提示
我正在处理的应用程序用于各种环境。我们通常使用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
答案 0 :(得分:2)
我认为ticketNumber
是Number
(Integer
,Long
,Double
等的实例。通常,当使用基本类型(int
,long
,double
等)时,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。