在我的JavaEE5.1.0GA和JBoss -5的部署中,我有一般形式的bean
public interface Foo {
void baz ();
}
@Stateless
public class FooBean implements Foo {
void baz() { // ...
}
}我假设这与我显式地用@Local注释Foo接口是一样的。通过在代码中看到堆栈跟踪,我认为它实际上使用了远程接口,而我希望我的所有bean都是本地的。
我是否需要显式地将接口注释为Local,或者是否有一些缺省值?事实证明,找到关于这方面的文档是具有挑战性的,因此任何到相关文档的链接都将非常感谢。
(编辑添加的可疑堆栈跟踪)
我得到的堆栈跟踪如下所示。可疑的行是"$Proxy638“。FooBean的注解如上所述,客户端和管理器都是POJO的(例如,完全没有注解任何Java相关项)。这个调用由一个消息驱动的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)请注意,我必须将代码匿名,所以任何与类名不匹配的事情几乎都是拼写错误!
发布于 2011-01-11 18:31:34
这是本地电话。
使用JBoss AS时,如果省略@Local注释,则会得到本地接口语义。我不能100%确定这是否符合规范,所以最好通过将注释放在那里来明确地定义它。
您看到的$Proxy638是EJB和类似组件模型工作方式的核心。这就是为什么不能使用new运算符创建EJB,而只能通过JNDI查找一个,或者通过@EJB或@Inject注解注入一个EJB的原因。
您永远不会直接获取对象,而是获取代理,也称为存根。在EJB术语中,我们说您在实际的bean上有一个Client view。这个代理允许EJB容器执行其AOP魔术,比如透明地启动事务并提交或回滚它。
https://stackoverflow.com/questions/4648062
复制相似问题