JBoss 5-解密堆栈跟踪

JBoss 5-解密堆栈跟踪,jboss,jakarta-ee,ejb-3.0,Jboss,Jakarta Ee,Ejb 3.0,在我使用JavaEE-5在JBoss 5.1.0GA上的部署中,我有一般形式的bean public interface Foo { void baz (); } @Stateless public class FooBean implements Foo { void baz() { // ... } } 我假设这与我用@Local显式注释Foo接口是一样的。从代码中看到堆栈跟踪,我认为它实际上使用的是远程接口,而我希望所有bean都是本地的 我需要显式地将接口注释为本地

在我使用JavaEE-5在JBoss 5.1.0GA上的部署中,我有一般形式的bean

public interface Foo {
   void baz ();
}

@Stateless
public class FooBean implements Foo {
   void baz() { // ...
   }
}
我假设这与我用@Local显式注释Foo接口是一样的。从代码中看到堆栈跟踪,我认为它实际上使用的是远程接口,而我希望所有bean都是本地的

我需要显式地将接口注释为本地的还是有一些默认的接口?事实证明,要找到关于这一点的文档是很有挑战性的,因此,如果能找到相关文档的链接,我们将不胜感激

(编辑添加的可疑堆栈跟踪)

我得到的堆栈跟踪如下所示。可疑行为“$Proxy638”。FooBean的注释如上所述,客户机和管理器都是POJO的(例如,完全没有任何与JavaEE相关的项目)。如果有帮助的话,这个调用将由消息驱动bean处理。我可以看到异常是我的(“我的错误消息在这里!”是我想要跟踪的消息)

请注意,我不得不匿名代码,因此任何与类名不匹配的事情几乎肯定都是打字错误

这是本地电话

使用JBoss AS,如果省略@Local注释,则会得到本地接口语义。我不能100%确定这是否符合规范,所以最好通过将注释放在那里来明确定义它

您看到的
$Proxy638
是EJB和类似组件模型工作原理的核心。这就是为什么不能使用新操作符创建EJB,而只能通过JNDI查找一个,或者通过@EJB或@Inject注释注入一个


您永远不会直接获取对象,而是获取一个代理,也称为存根。用EJB术语来说,您在实际bean上有一个
客户机视图
。此代理允许EJB容器执行其AOP魔术,例如透明地启动事务并提交或回滚它。

似乎确认默认值是本地的,但我希望有一个授权源(例如,来自JBoss或EJB规范的内容)。堆栈跟踪的哪一部分使您认为它是远程的?我在堆栈跟踪中添加了有关该问题的更多详细信息。$Proxy是您的业务逻辑和JBoss的底层ejb内部之间的代理。我不太喜欢jboss stacktraces,但通常远程调用错误日志中充满了对象I/O流、远程调用、编组等内容。在您的情况下没有问题:)我能做些什么来获得更好的堆栈跟踪?“我的错误消息异常”在我的代码中的不同位置抛出,但我只想看看在哪里!不过,所讨论的对象是我的对象之一,所以我希望能够从中获取堆栈跟踪?目前的堆栈跟踪没有包括在我自己的代码中引发异常的位置的详细信息;这就是我试图解决的问题(而不是过滤掉JBoss的噪音)。我猜这是一个与EJB无关的基本Java问题:您所追求的异常被EJBTransactionRolledbackException包装,您只需通过调用
exception=exception.getCause()来遍历异常链
在循环中,直到异常为空。
2011-01-10 11:15:06,428 ERROR [org.jboss.resource.adapter.jms.inflow.JmsServerSession](WorkManager(2)-11) Unexpected error delivering message delegator->JBossMessage[21211678385963013]:PERSISTENT, deliveryId=5
javax.ejb.EJBTransactionRolledbackException: My error message goes here!
  at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)
  at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
  at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:194)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.security.RunAsSecurityInterceptorv2.invoke(RunAsSecurityInterceptorv2.java:94)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorv2.invoke(RoleBasedAuthorizationInterceptorv2.java:201)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
  at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:182)
  at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:240)
  at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:188)
  at $Proxy638.generateWidget(Unknown Source)
  at com.foobar.managers.Client.writeBananaToStream(Client.java:456)
  at com.foobar.managers.Client.write(Client.java:123)
  at com.foobar.managers.Manager.persist(Manager.java:275)
  at com.foobar.FooBean.doSomething(FooBean.java:1243)