在Eclipse中进入Java EE代码

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管道方法调用,我不想检查!

在进入方法时,我唯一可靠的方法是在下一个方法调用中放置一个断点,然后点击“Step Over”而不是“Step Into”。 然而,像这样一个简单的“Step Into”相比,像这样设置断点是一个主要的麻烦。 当我需要退出正在检查的方法时,我必须重复相同的操作。

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

有没有人有这个好的解决方案?

更新

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

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

编辑2

以下是MyService类的一个例子:

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

由于其他EJB是在无状态容器中运行的EJB Bean,因此上面的30个调用通过代理自动插入。


关于Eclipse步骤过滤器的一些信息:

Eclipse调试/步入跳过AOP布线的方法

如何在调试视图中过滤动态生成的类?

与TomEE一起使用的实际步骤筛选器:

*$LocalBeanProxy
*$CGLibInterceptor
net.sf.*
org.apache.geronimo.*
org.apache.naming.*
org.apache.openejb.*
org.apache.tomee.*
org.apache.webbeans.*

在调试时,只需按住CtrlAlt,将鼠标悬停在要再次停止的方法名称上,直至变为超链接,然后单击方法名称。 该功能被称为步入选择。


代码+测试(通过运行,不设置断点)递增。 EE中的异常堆栈通常是无用的。

链接地址: http://www.djcxy.com/p/65233.html

上一篇: Step into Java EE code in Eclipse

下一篇: Any SaaS solution to host a private maven repository