Я нахожусь в процессе преобразования большого приложения J2EE (называемого ниже AeApp) из EJB 2 в EJB 3 (все сессионные bean-компоненты без сохранения состояния, с использованием Glassfish 2.1.1), и у меня заканчиваются идеи.
Первый преобразованный мной EJB (назовем его Foo) работал без серьезных проблем (он был единственным в своем модуле ejb, и я мог полностью заменить дескриптор развертывания аннотациями), и приложение работало нормально. Но после преобразования второго (назовем его Bar, одного из нескольких в другом ejb-модуле) возникает странная комбинация проблем:
AeApp развертывается без ошибок (в логах тоже ничего). В журнале я получаю сообщения инициализации как для Foo, так и для Bar, но дальнейшие сообщения о разрешениях методов и имени JNDI только для Foo:
[#|2010-05-10T12:26:13.234+0200|FINE|sun-appserver2.1|javax.enterprise.system.core.security|_ThreadID=25;_ThreadName=Thread-2821;ClassName=com.sun.enterprise.security.application.EJBSecurityManager;MethodName=initialize;_RequestID=1801c4ff-90fe-4406-aaac-219c669be8c1;|Codebase (module id for ejb Foo) = null|#] [#|2010-05-10T12:26:11.625+0200|FINE|sun-appserver2.1|javax.enterprise.system.core.security|_ThreadID=25;_ThreadName=Thread-2821;ClassName=com.sun.enterprise.security.application.EJBSecurityManager;MethodName=initialize;_RequestID=1801c4ff-90fe-4406-aaac-219c669be8c1;|Codebase (module id for ejb Bar) = null|#] [#|2010-05-10T12:26:13.234+0200|FINE|sun-appserver2.1|javax.enterprise.system.core.security|_ThreadID=25;_ThreadName=Thread-2821;ClassName=com.sun.enterprise.security.application.EJBSecurityManager;MethodName=fooMethod;_RequestID=1801c4ff-90fe-4406-aaac-219c669be8c1;|JACC DD conversion: EJBMethodPermission ->(Foo fooMethod,Remote,java.lang.Long,java.util.Locale)protected by role -> FOOUSER|#] [#|2010-05-10T12:26:19.312+0200|INFO|sun-appserver2.1|javax.enterprise.system.container.ejb|_ThreadID=17;_ThreadName=httpWorkerThread-14848-1;|**RemoteBusinessJndiName: com.example.Foo; remoteBusIntf: com.example.Foo|#]Ошибка при поиске Bar через JNDI
- При просмотре дерева JNDI в административной консоли Glassfish Bar вообще отсутствует.
- Другие EJB в том же модуле появляются, как и Foo.
- В журналах есть исключения, касающиеся Foo, но они уже появились, когда он еще работал.
Есть идеи, что могло вызвать это или как диагностировать это дальше? Бобы довольно просты:
@Stateless(name = "Foo")
@RolesAllowed("FOOUSER")
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class FooImpl extends BaseBean implements Foo {
У меня также есть некоторые проблемы с дескриптором развертывания для Bar: я бы хотел его устранить, но Glassfish, похоже, не любит, когда bean-компонент отображается только в sun-ejb-jar.xml или имеет некоторые beans в модуль, объявленный в дескрипторе, и другие используют только аннотации.
Изменить: EAR имеет такую структуру:
AeApp.ear
AeApp.war
Foo.jar (Foo.class and FooImpl.class present here)
Bar.jar (Bar.class and BarImpl.class present here, also BaseBean.class)
(some more EJB module JARs)
(lots of library JARs)
AeApp.ear не имеет (и у AFAIK никогда не было, даже когда он работал) META-INF / MANIFEST.MF. Его application.xml выглядит так:
<application>
<description>AE EAR</description>
<display-name>AE EAR</display-name>
<module><ejb>Foo.jar</ejb></module>
<module><ejb>Bar.jar</ejb></module>
<module><ejb>Baz.jar</ejb></module>
<module><ejb>Doh.jar</ejb></module>
<module><web>
<web-uri>AeApp.war</web-uri>
<context-root>/</context-root>
</web></module>
</application>