gpt4 book ai didi

spring - 在 Spring 中,为什么 POJO 上的 CGLib 会丢失行号?

转载 作者:行者123 更新时间:2023-12-04 06:21:09 24 4
gpt4 key购买 nike

Spring MVC 网络应用:

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

我推测这是由于在 Controller 上运行的 CGLib。但这对我来说很奇怪,实际异常发生在 ServerBatchRemoteRequestAcceptor 中,这是一个未注入(inject)的 pojo,而不是 Controller 。它仅在 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,我的 Controller 下的每个调用都会没有行号吗?

我应该将 Controller 写入接口(interface)以便使用代理吗?那是正常的吗?我这样做是为了服务,但将 Controller 作为简单的 POJO 来完成。

最佳答案

Spring 使用 CGLIB 生成位于某些组件/ Controller 前面的代理对象。对这些组件的调用通过 CGLIB 代理传递。这些代理是在运行时生成的,没有源代码,因此它们没有行号。

不过,您几乎可以忽略提及 CGLIB 的堆栈跟踪行 - 假装它们不存在,它们应该是透明的。

在您的堆栈跟踪中,对 RESTServicesController.handleGenericClientRequest 的调用已被代理,但调用仍在进行中。 NPE 发生在 ServerBatchRemoteRequestAcceptor 中,它是从 RESTServicesController.handleGenericClientRequest 调用的。

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

关于spring - 在 Spring 中,为什么 POJO 上的 CGLib 会丢失行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6548460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com