在我使用JavaEE-5的JBoss 5.1.0GA部署中,我有一般形式的bean
public interface Foo {
void baz ();
}
@Stateless
public class FooBean implements Foo {
void baz() { // ...
}
}
我认为这与我用@Local明确注释Foo接口的情况相同。从代码中看到堆栈跟踪,我认为它实际上是使用远程接口,而我希望我的所有bean都是本地的。
我是否需要明确地将接口注释为Local或者是否存在默认值?找到关于此的文档证明具有挑战性,因此非常感谢任何相关文档的链接。
(编辑添加的可疑堆栈跟踪)
我得到的堆栈跟踪看起来像这样。可疑的行是“$ Proxy638”。 FooBean注释为如上所述,并且Client和Manager都是POJO(例如,完全未注释任何Java EE相关项)。如果有帮助,则由Message-Driven bean处理此调用。我可以看到异常是我的一个(“我的错误消息就在这里!”是我想要实际堆栈跟踪的消息)。
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)
请注意,我必须对代码进行匿名处理,因此任何与类名称不匹配的内容几乎肯定是错别字的!
答案 0 :(得分:2)
这是本地电话。
使用JBoss AS,如果省略@Local注释,则会获得本地接口语义。我不是100%确定这是否符合规范,因此最好通过在那里放置注释来明确定义它。
您看到的$Proxy638
是EJB和类似组件模型如何工作的核心。这就是为什么你不能使用new运算符来创建EJB的原因,但只能通过JNDI查找一个,通过@EJB或@Inject注释注入一个。
您永远不会直接获取对象,而是获得代理,也称为存根。在EJB术语中,您可以在实际bean上使用Client view
。此代理允许EJB容器执行其AOP魔术,例如透明地启动事务并提交或回滚它。