2

Spring MVC Web アプリ:

行番号のないスタック トレースがあります (下部に表示)。

これは、コントローラーで実行されている CGLib が原因であると推測されます。しかし、これは私には奇妙です。実際の例外はServerBatchRemoteRequestAcceptor、コントローラーではなく、注入されていない pojo で発生します。Controller オブジェクトでのみ作成されます。

例:

@Controller
class MyController {
    MyPojo pojo = new MyPojo();

    @RequestMapping("myaction")
    public void doMyAction(){
        pojo.methodToCauseNullPointerException()
    }
}

java.lang.NullPointerException
at mycommons.services.batchremoteprocessor.ServerBatchRemoteRequestAcceptor.acceptRequest(Unknown Source)
at com.proxyandvpn.web.controllers.RESTServicesController.handleGenericClientRequest(Unknown Source)
at com.proxyandvpn.web.controllers.RESTServicesController$$FastClassByCGLIB$$dff24f0f.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)

誰かが私にこの振る舞いを説明できますか? CGLib が原因で、コントローラーの下のすべての呼び出しに回線番号がなくなりますか?

プロキシが使用されるように、コントローラをインターフェイスに書き込む必要がありますか? それは正常ですか?私はサービスのためにそれを行いますが、コントローラーは単純な POJO として行いました。

4

2 に答える 2

2

Spring は CGLIB を使用して、一部のコンポーネント/コントローラーの前に配置されるプロキシ オブジェクトを生成します。これらのコンポーネントへの呼び出しは、CGLIB プロキシを通過します。これらのプロキシは、ソース コードなしでランタイムに生成されるため、行番号はありません。

ただし、CGLIB に言及しているスタック トレース行はほとんど無視できます。それらが存在しないふりをして、透過的である必要があります。

スタック トレースでは、への呼び出しRESTServicesController.handleGenericClientRequestはプロキシされていますが、呼び出しはまだそこに到達しています。ServerBatchRemoteRequestAcceptorから呼び出されている内で NPE が発生していますRESTServicesController.handleGenericClientRequest

ただし、投稿されたソースコードはスタックトレースとは関係がないため、なぜそれが起こったのかについてコメントするのは困難です.

于 2011-07-01T13:33:57.127 に答える
1

私は自分の問題を知っているので、この回答に追加します。問題を理解していない場合によくあることですが、私は適切な質問をしませんでした。

私は最近、Eclipse ビルダーの代わりに ANT ビルドを使用するように切り替えました。タスクでデバッグ情報を明示的に有効にする必要があることに気づきませんでした。このエラーの前に CGLib が表示されているのを見て、無意識のうちに CGLib のせいだと思いましたが、必要なのは ANT ビルドの変更だけでした。

于 2011-07-03T06:18:11.010 に答える