У меня есть рабочая установка Glassfi sh 5 внутри Eclipse.
У меня есть модули, настроенные так:
common
- содержит удаленный интерфейс для одноэлементного компонента с аннотацией @remote и @local
- во всех других модулях в виде зависимости pom
core
- содержит одноэлементный компонент, реализующий общий интерфейс
- , предназначенный для хранения классов обслуживания, хранящихся в JNDI, который позволяет любому количеству клиентов искать и хранить данные и / или получать доступ к другим сервисным логам c
- , создает файл войны, который развертывается на GlassFi sh
десктоп
- выполняет поиск InitialContext одиночного компонента. (Я намерен абстрагировать это в шаблон проектирования Service Lookup).
- предназначен для настольного клиента, который удаленно обращается к бинам, хранящимся на сервере.
- Прямо сейчас, я просто пытаюсь заставить его получить удаленный доступ к сервису в ядре и распечатать некоторый текст на консоли, доказав, что он работает.
Я думаю, что моя проблема связана с неправильным пониманием того, как в первую очередь хранить пользовательский компонент в JNDI , Я посмотрел в Google, но я в основном нахожу статьи и ответы на вопросы, в которых говорится, что я должен добавить name и mappedName к аннотации Singleton, или они показывают только то, как добавить предопределенный bean-компонент в JDNI, такой как Boolean или String, а не что-то определяемое пользователем.
Мой компонент определяется следующим образом:
@Singleton(name = "BookService", mappedName = "ejb/BookService")
public class BookServiceImpl implements BookService {
private static final long serialVersionUID = 1L;
, что приводит к этому на сервере Glassfi sh: Скриншот основного сервера
, но в JNDI ничего не отображается: Снимок экрана JNDI
Клиент выполняет поиск InitialContext следующим образом (я пробовал несколько способов написания имени JNDI):
BookService bookService = (BookService) initialContext.lookup("java:global/core/BookService");
используя эти конфигурации (я определил свой домен с базовым портом 8000, поэтому каждый порт равен 8000 + что-то):
glashfishEnvironmentTable = new Hashtable<String, String>();
glashfishEnvironmentTable.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.enterprise.naming.impl.SerialInitContextFactory");
glashfishEnvironmentTable.put(Context.STATE_FACTORIES,
"com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
glashfishEnvironmentTable.put(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming");
//glashfishEnvironmentTable.put(Context.PROVIDER_URL, "ejbd://localhost:8080/");
// on a different host than the appserver
glashfishEnvironmentTable.put("org.omg.CORBA.ORBInitialHost", "localhost");
// optional. Defaults to 3700. Only needed if target orb port is not 3700.
glashfishEnvironmentTable.put("org.omg.CORBA.ORBInitialPort", "8037");
При запуске я получаю такую ошибку:
Exception in thread "main" javax.naming.CommunicationException: Communication exception for SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=8037, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.rmi.MarshalException: CORBA MARSHAL 1330446343 No; nested exception is:
org.omg.CORBA.MARSHAL: FINE: 00810007: Underflow in BufferManagerReadStream after last fragment in message vmcid: OMG minor code: 7 completed: No]
Я думаю, что мой InitialContext настроен правильно, потому что, когда я вручную определяю bean-компонент в JNDI, как это (ServiceFactory ничего не делает, потому что я не знаю, как правильно расширить ObjectFac tory):
Бин, определенный в JNDI
Я получаю это:
Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to common.service.BookService
Есть ли простое исправление, которого я пропускаю, или я Я смешиваю масло и воду, пытаясь включить EJB Singleton в JNDI? Или мне не хватает чего-то большого, например EJBHome или Servlet?
Нужно ли расширять фабричный класс, чтобы добавить свои классы обслуживания в JDNI, или должен работать ObjectFactory? Если я должен расширить фабричный класс, как бы я go об этом?
Надеюсь, я достаточно хорошо определил сферу охвата вопроса, но для меня это все ново, так что если у кого-то есть опыт реализуя что-то вроде этого, я ценю любой вклад, который приближает меня к правильному выполнению.