2011-01-10 117 views
1

在我在JBoss 5.1.0GA部署,JavaEE的-5我有一般形式JBoss的5 - 解讀堆棧跟蹤

public interface Foo { 
    void baz(); 
} 

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

我假定這是一樣的,如果我有明確的註解豆Foo與@Local的接口。從代碼中看到堆棧跟蹤,我認爲它實際上是使用遠程接口,而我希望所有的bean都是本地的。

我是否需要明確註釋接口爲本地或有一些默認?查找關於此的文檔是具有挑戰性的,因此任何指向相關文檔的鏈接都將不勝感激。

(編輯添加可疑的堆棧跟蹤)

堆棧跟蹤我得到這個樣子的。可疑的行是「$ Proxy638」。 FooBean註釋如上所述,Client和Manager都是POJO的(例如,完全沒有任何Java EE相關項目的註釋)。這個調用正在被消息驅動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

http://openejb.apache.org/3.0/simple-stateless-example.html似乎確認默認是本地的,但我希望獲得一個授權源(例如來自JBoss或來自EJB規範的東西) 。 – 2011-01-10 15:09:13

+1

堆棧跟蹤的哪部分使您認爲它是遠程的? – Osw 2011-01-10 15:13:52

回答

2

這是一個本地電話。

對於JBoss AS,如果您省略@Local註釋,您將獲得本地接口語義。我不是100%確定這是否符合規範,所以更好地通過在那裏添加註釋來明確地定義它。

您看到的$Proxy638是EJB和類似組件模型工作的核心。這就是爲什麼你不能使用new操作符來創建EJB的原因,但是隻能通過JNDI查看一個通過@EJB或@Inject註釋注入的操作符。

你永遠不會直接獲取對象,而是獲得代理,也稱爲存根。用EJB術語說,實際的bean上有一個Client view。此代理允許EJB容器執行其AOP魔術,例如透明地啓動事務並提交或回滾它。