在Eclipse中进入Java EE代码

7

在Eclipse和Java EE代码中进行调试会很麻烦,我希望有人能提供比我更好的方法。

这是两个EJB无状态bean方法之间的典型调用堆栈(使用TomEE 1.0):

NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
ReflectionInvocationContext$BeanInvocation(ReflectionInvocationContext$Invocation).invoke() line: 181   
ReflectionInvocationContext.proceed() line: 163 
StatsInterceptor.record(InvocationContext, Method) line: 176    
StatsInterceptor.invoke(InvocationContext) line: 95 
GeneratedMethodAccessor35.invoke(Object, Object[]) line: not available  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
ReflectionInvocationContext$InterceptorInvocation(ReflectionInvocationContext$Invocation).invoke() line: 181    
ReflectionInvocationContext.proceed() line: 163 
CdiInterceptor.invoke(InvocationContext) line: 129  
CdiInterceptor.access$000(CdiInterceptor, InvocationContext) line: 45   
CdiInterceptor$1.call() line: 66    
CdiInterceptor.aroundInvoke(InvocationContext) line: 72 
GeneratedMethodAccessor34.invoke(Object, Object[]) line: not available  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
ReflectionInvocationContext$InterceptorInvocation(ReflectionInvocationContext$Invocation).invoke() line: 181    
ReflectionInvocationContext.proceed() line: 163 
InterceptorStack.invoke(Object...) line: 138    
StatelessContainer._invoke(Method, Method, Object[], Instance, ThreadContext, InterfaceType) line: 226  
StatelessContainer.invoke(Object, InterfaceType, Class, Method, Object[], Object) line: 178 
StatelessEjbObjectHandler(EjbObjectProxyHandler).synchronizedBusinessMethod(Class<?>, Method, Object[], Object) line: 260   
StatelessEjbObjectHandler(EjbObjectProxyHandler).businessMethod(Class<?>, Method, Object[], Object) line: 240   
StatelessEjbObjectHandler(EjbObjectProxyHandler)._invoke(Object, Class, Method, Object[]) line: 91  
StatelessEjbObjectHandler(BaseEjbProxyHandler).invoke(Object, Method, Object[]) line: 284   
MyService$LocalBeanProxy.removeScheduledEvent(ScheduledEvent) line: not available   

这是30行Java EE管道方法调用,我不想检查!

当我进入一个方法时,唯一可靠的跳过所有这些的方法是在下一个方法调用中设置断点,然后点击“步过”而不是“步入”。然而,与简单的“步入”相比,始终设置断点是一个很大的麻烦。当我需要退出我正在检查的方法时,我必须重复同样的操作。

我知道Eclipse中的步骤过滤器并尝试使用它们,但是一些自动生成的代理类被注入到我的包中,因此我不能轻松使用它们。

有人有好的解决方案吗?

更新

现在使用以下步骤过滤器可以跳过所有不需要的步骤:

*$$*  // for CGLib proxies
*$LocalBeanProxy  // for other EJB proxies
java.*
net.sf.*
sun.*

编辑 2

这里是 MyService 类的一个示例:

public void removeScheduledEvent(ScheduledEvent event) {
    // ...
    otherEJB.doStuff(event);
}

因为otherEJB是在无状态容器中运行的EJB bean,所以上面的30个调用会通过代理自动插入。

3个回答

4

2

当进行调试时,只需按住CtrlAlt,将鼠标悬停在您想要再次停止的方法名称上,直到它变成超链接,然后单击该方法名称。这个功能被称为Step into Selection


谢谢分享这个技巧,我之前不知道。然而,这并不能跳过我自己的两种方法之间的30多个中间步骤。 - bernie
如果是这样的话,步骤过滤器可能是你唯一的解决方案。我只在像mockito这样的模拟框架中看到过这种不必要的行为,在那里添加步骤过滤器就足够跳过每个“自动生成”的模拟框架方法了。或者你的框架是否使用了字节码操作?这可能会让问题更加复杂。 - Bananeweizen

-1

通过逐步运行代码和测试(而不是设置断点),逐步增量。在EE中,异常堆栈通常是无用的。


有时候会起作用。在像我这样更复杂的场景下,我发现通过逐步调试代码来查找异常原因要容易得多。 - bernie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接