1

これは一種の奇妙なシナリオであり、私が求めているのは、誰かが過去に同様のことを経験したことがあるかどうか、および考えられるケースのヒントです

私が取り組んでいるアプリケーションは、さまざまな環境で使用されています。通常、開発には Tomcat を使用し、統合環境の 1 つは Websphere です。

今のような声明

BillingPaymentAssembler.java:149

finActivity.setReferenceNo(paymentDetail.getTicketNumber());

どこで ticketNumber はStringであり、単体テスト中に Tomcat で正常に実行されます。しかし、websphere にデプロイするnullPointerExceptionと、同じテスト ケースに対して がスローされます。

更新 #1

UI で JSF2 を使用しています。paymentDetail は Bean です。

ticket numberticketNumberのbeanに対応するUI上のフィールドです。

のUIで何も入力せず、ticket number空白のままにした場合。その場合、私は例外を受け取ります

更新 #2

[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R java.lang.NullPointerException
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.csa.assembler.BillingPaymentAssembler.disassemble(BillingPaymentAssembler.java:149)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.AccelTransformation.disassemble(AccelTransformation.java:79)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at java.lang.reflect.Method.invoke(Method.java:600)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.ServiceHandler.invoke(ServiceHandler.java:59)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.AccelService.callService(AccelService.java:1087)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.csa.process.BillingPaymentBP.process(BillingPaymentBP.java:29)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.AccelBP.process(AccelBP.java:62)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at java.lang.reflect.Method.invoke(Method.java:600)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.service.ServiceControllerBP.process(ServiceControllerBP.java:54)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.service.ServiceControllerAbstract.internalExecute(ServiceControllerAbstract.java:278)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.service.ServiceControllerAbstract.execute(ServiceControllerAbstract.java:197)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.delegate.DirectServiceController.execute(DirectServiceController.java:61)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.delegate.ServiceDelegateDirect.execute(ServiceDelegateDirect.java:70)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.BaseServiceAction.execute(BaseServiceAction.java:584)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.action.policy.services.MaintainBillingPayment.perform(MaintainBillingPayment.java:145)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.BaseServiceAction.perform(BaseServiceAction.java:618)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.ServiceDelegator.execute(ServiceDelegator.java:506)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.ServiceDelegator.processEvent(ServiceDelegator.java:240)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.BeanBase.executeEvent(BeanBase.java:779)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at pagecode.policy.file.Billing.executeBillingPayments(Billing.java:498)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at java.lang.reflect.Method.invoke(Method.java:600)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:67)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at javax.faces.component.UICommand.broadcast(UICommand.java:315)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1655)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1595)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.csc.fs.accel.ui.filters.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:82)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:895)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:932)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:500)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:864)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:183)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
[1/16/13 5:25:02:750 EST] 00000019 SystemErr     R  at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550)
4

1 に答える 1

2

それは( 、、など)ticketNumberのインスタンスであると仮定します。通常、プリミティブ型 ( 、、など) が使用される場合、EL は自動的に空の文字列の送信された値をプリミティブのデフォルトであるorに強制します。ラッパー オブジェクト タイプの場合、EL パーサーに違いがあります。EL仕様はそれについて明確ではないため、および/または非プリミティブ タイプで空の文字列が送信された値に対して強制が非常に理にかなっているからです。NumberIntegerLongDoubleintlongdouble00.0null

Apache EL パーサーに付属する Tomcat は、Numbertype で送信された空の文字列の値をプリミティブ表現のデフォルト値に強制します。したがって、タイプの空の送信された値は、代わりにIntegerとして設定されます。どうやらこれは「正しい」動作であると想定しており、コードもそれを傍受するように記述されています。0null

ただし、この明らかなケースの WebSphere などの他のサーバーnullは、プリミティブ表現のデフォルト値ではなく、NPE を引き起こします。

基本的に、バグはコードにあります。値をnull考慮するか、「値なし」の有効な表現である場合intの代わりに使用する必要があります (ビジネス要件によって異なります)。すべてのサーバーが同じように動作するようにするには、基本的に、Tomcat に送信された空の文字列の値を強制しないように指示する必要があります。これを行うには、次の VM 引数を Tomcat 起動スクリプトに追加します。Integer0Number0

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

この問題は本質的に JSF とは無関係であることに注意してください。たまたまELを使っているだけです。

以下も参照してください。

于 2013-01-16T12:05:30.807 に答える