5

我有一个使用 Spring 和 jpa 构建的网站(通过休眠)。我有一个错误,我不知道如何识别错误出现的行。

我无法在我的 ide 上调试它,因为它是一个实时版本(在本地运行良好)。

我有日志,上面写着:o

rg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)#012#011

at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)#012#011

at com.mycompany.server.rpc.UserService$$EnhancerByCGLIB$$64ed2d4f.createAccount(<generated>)#012#011

at com.mycompany.server.rpc.ServiceRPCImpl.createAccount(ServiceRPCImpl.java:309)

我的问题是第三行。由于 UserService 对象是由 Spring 处理的,所以它变成了一个代理,我不知道 bug 所在的行。

你知道如何解决这个问题吗?

谢谢

4

3 回答 3

3

您可以从 cglib 更改为 jdk 代理吗?(Spring AOP 代理参考

基本上:如果您将 bean 作为接口访问,则可以使用 jdk 代理(spring 默认机制),从而使底层对象保持不变并访问堆栈跟踪中的行号。

于 2010-08-17T16:07:46.397 回答
0

我想说的是,不能在本地复制它是一个很大的限制。我会尝试设置您的本地环境或测试服务器来重现问题,使用 JMeter 或其他负载测试软件来模拟并发用户访问的负载。完成此操作后,您的调整/编译/测试周期会变得更短,并且您可以进行实验性更改而不必担心中断生产服务器上的服务。这似乎需要付出很多努力,但这项工作不仅会为这个错误带来回报,还会为您将来可能遇到的错误带来回报。

听起来这可能是一个线程错误,特别是因为 spring 默认使用单例范围。考虑到这一点,请考虑为失败的服务创建多线程集成测试。一旦您通过负载测试重现了该错误,您可以通过设置您的主要服务方法来验证它是一个线程错误synchronized,防止并发使用。如果 bug 消失,则很可能是并发 bug。

至于查找错误所在的行 - 由于代码已生成,因此无需查找行。您可以做的最好的事情是在围绕 UserService 的建议中使用的所有 bean 中添加防御性检查。(例如,由于缺少注入而检查空值。) bean 上的init-method属性对于执行检查 bean 是否已完全构造以及所有必需的协作者是否已设置很有用。

于 2010-08-13T12:46:47.650 回答
0

如果您无法在本地环境中重现该问题,则可能是环境/网络相关问题。我会首先在测试环境(更接近生产环境,而不仅仅是自己的本地机器)中重新创建问题来调试错误。

您还可以使用 Fiddler 调试实时版本的网络相关问题。

于 2010-08-17T02:28:01.460 回答