В моем развертывании на JBoss 5.1.0GA с JavaEE-5 у меня есть бины общего вида
public interface Foo {
void baz ();
}
@Stateless
public class FooBean implements Foo {
void baz() { // ...
}
}
Я предположил, что это так же, как если бы я явно аннотировал интерфейс Foo с помощью @Local. Видя трассировку стека в коде, я думаю, что он на самом деле использует удаленный интерфейс, тогда как я хочу, чтобы все мои bean-компоненты были локальными.
Нужно ли явно аннотировать интерфейсы как локальные или по умолчанию? Поиск документации по этому вопросу является сложной задачей, поэтому любые ссылки на соответствующую документацию будут с благодарностью.
(редактировать добавленную трассировку подозрительного стека)
Трассировка стека, которую я получаю, выглядит следующим образом. Подозрительная строка - "$ Proxy638". FooBean помечен как описанный выше, а Client и Manager оба являются POJO (например, полностью не аннотированы ни с какими элементами, связанными с Java EE). Этот вызов обрабатывается компонентом, управляемым сообщениями, если это полезно. Я вижу, что исключение - одно из моих («Мое сообщение об ошибке идет сюда!» - это сообщение, которое я хочу отследить от реального стека).
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)
Обратите внимание, что мне пришлось анонимизировать код, поэтому любые несоответствующие вещи, связанные с именами классов, почти наверняка опечатки!