2

Spring MVC 网络应用程序:

我有一个没有行号的堆栈跟踪(显示在底部)。

我认为这是由于控制器上运行的 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已被代理,但调用仍然到达那里。NPE 发生在 中ServerBatchRemoteRequestAcceptor,从 中调用RESTServicesController.handleGenericClientRequest

但是,您发布的源代码与堆栈跟踪无关,因此很难评论它发生的原因。

于 2011-07-01T13:33:57.127 回答
1

我将添加到这个答案,因为我现在知道我的问题。当您不理解问题时,这是很常见的,我没有问正确的问题。

我最近切换到使用 ANT 构建而不是 Eclipse 构建器。我没有意识到我需要在任务中明确启用调试信息。当我看到 CGLib 出现在这个错误前面时,我无意中责怪了它,但所需要的只是 ANT 构建修改。

于 2011-07-03T06:18:11.010 回答