如何知道弹簧生成的bean中的错误行?

问题描述:

我有一个网站建立与Spring和Jpa(通过休眠)。我有一个错误,我不知道如何确定错误出现的位置。如何知道弹簧生成的bean中的错误行?

我不能在我的IDE上调试它,因为它是一个活动版本(所有在本地运行良好)。

我有日志它说: Ø

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处理的,它变成了一个代理,我无法知道错误的行。

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

感谢

+0

我想知道答案,但是我通常在这种情况下做的是穷人调试 - 将一堆记录器调用插入方法并查看它停在哪一行。 – serg 2010-04-15 21:52:16

+0

是的,这也是我所做的。但是,由于我的产品是活的,它意味着创建日志,重新编译并将其发送到服务器并查看。哦,不,我忘了日志,重新做所有的东西...真的很差... – 2010-04-16 08:28:32

+0

你可以发布完整的日志,并提供一些错误的更多细节? – 2010-05-06 16:14:54

是否有可能从cglib更改为jdk代理? (Spring AOP proxy reference

基本上来说:如果你作为接口访问你的bean,你可以使用jdk代理(spring默认机制),从而使底层对象保持原样并获得对堆栈跟踪中行号的访问。

+0

这似乎是一个很好的解决方案,但是这种不同的模型有什么样的性能问题或问题吗? – 2010-08-18 07:33:50

+0

不是我所知道的。正如我所说:这是春天做事的标准方式,数以千计(可能是数百万)服务器使用它。如果您将服务作为接口注入,而不是类,Spring将自动使用jdk代理。 – 2010-08-18 07:52:51

+0

谢谢我会试试! – 2010-08-19 09:30:24

我要说的是不能够重现本地这是一个显著克制。我会尝试设置您的本地环境或测试服务器来重现问题,使用JMeter或其他负载测试软件来模拟并发用户访问的负载。完成此操作后,您的调整/编译/测试周期将缩短很多,您可以进行实验性更改,而不必担心会中断生产服务器上的服务。这可能看起来像很多努力,但这项工作不仅会为此错误带来好处,而且还会为您将来可能遇到的错误带来好处。

这听起来像它可能是一个线程错误,尤其是因为春天默认情况下使用单例作用域。考虑到这一点,请考虑为失败的服务创建多线程集成测试。一旦通过负载测试再现了该错误,您可以通过使用主要服务方法​​来防止并发使用,从而验证是否存在线程错误。如果错误消失了,那很可能是一个并发错误。

至于找到错误的行 - 从代码生成后没有找到线。您可以做的最好的做法是在用户服务的建议中使用的所有Bean中添加防御性检查。 (例如,由于缺少注入而检查空值)。bean上的init-method属性对于执行检查以确定Bean已完全构建并且已设置所有必需的协作者非常有用。

如果您不能在本地环境中重现问题,那么可能是环境/网络相关问题。我首先会在测试环境(更接近生产环境,而不仅仅是本地计算机)中重新创建问题以调试该错误。

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