首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JBoss 5-解密堆栈跟踪

JBoss 5-解密堆栈跟踪
EN

Stack Overflow用户
提问于 2011-01-10 22:53:09
回答 1查看 2.5K关注 0票数 1

在我的JavaEE5.1.0GA和JBoss -5的部署中,我有一般形式的bean

代码语言:javascript
复制
public interface Foo {
   void baz ();
}

@Stateless
public class FooBean implements Foo {
   void baz() { // ...
   }
}

我假设这与我显式地用@Local注释Foo接口是一样的。通过在代码中看到堆栈跟踪,我认为它实际上使用了远程接口,而我希望我的所有bean都是本地的。

我是否需要显式地将接口注释为Local,或者是否有一些缺省值?事实证明,找到关于这方面的文档是具有挑战性的,因此任何到相关文档的链接都将非常感谢。

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

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

代码语言:javascript
复制
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)

请注意,我必须将代码匿名,所以任何与类名不匹配的事情几乎都是拼写错误!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-11 18:31:34

这是本地电话。

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

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

您永远不会直接获取对象,而是获取代理,也称为存根。在EJB术语中,我们说您在实际的bean上有一个Client view。这个代理允许EJB容器执行其AOP魔术,比如透明地启动事务并提交或回滚它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4648062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档