我有一个使用Spring和jpa(通过hibernate)构建的网站。我有一个错误,我不知道如何识别出现错误的行。
我无法在我的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处理,它变成了代理,我无法知道bug的行。
你知道如何解决这个问题吗?
由于
答案 0 :(得分:3)
您是否可以从cglib更改为jdk代理? (Spring AOP proxy reference)
基本上:如果您将bean作为接口访问,则可以使用jdk代理(spring default mechanism),从而保持底层对象的完整性并获得对堆栈跟踪中行号的访问权。
答案 1 :(得分:0)
我想说无法在本地重现这一点是一个重要的限制。我会尝试设置您的本地环境或测试服务器来重现问题,使用JMeter或其他负载测试软件来模拟并发用户访问的负载。完成此操作后,您的调整/编译/测试周期会变得更短,您可以进行实验性更改,而不必担心会破坏生产服务器上的服务。看起来似乎需要付出很多努力,但这项工作不仅可以为这个漏洞带来好处,还可以为将来可能遇到的漏洞带来好处。
听起来它可能是一个线程错误,特别是因为Spring默认使用singleton范围。考虑到这一点,请考虑为失败的服务创建多线程集成测试。通过负载测试再现错误后,您可以通过制定主服务方法synchronized
来验证它是一个线程错误,从而防止并发使用。如果错误消失,很可能是并发错误。
至于查找错误的行 - 自生成代码以来,没有要查找的行。您可以做的最好的事情是在围绕UserService的建议中使用的所有bean中添加防御性检查。 (例如,由于缺少注入而检查空值。)bean上的init-method
属性对于执行已完全构造bean并且已设置所有必需协作者的检查非常有用。
答案 2 :(得分:0)
如果无法在本地环境中重现问题,那么可能是环境/网络相关问题。我首先要在测试环境(更接近生产环境而不仅仅是本地机器)中重新创建问题来调试错误。
您也可以使用Fiddler调试实时版本的网络相关问题。