Ошибка клиента при вызове EJB: javax.naming.NoInitialContextException - PullRequest
0 голосов
/ 19 апреля 2020

Вызов моего EJB из класса Main:

MyService myService = (MyService) ctx.lookup(MyService.class.getName());

Дает ошибку:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.ejb.calculator.Main.main(Main.java:26)

Как мне вызвать мой EJB?

Попробовал два разных вызова JNDI:

JNDI_NAME = "java:global/ejb/MyService";
MyService myService = (MyService) ctx.lookup(JNDI_NAME);

и

MyService myService = (MyService) ctx.lookup(MyService.class.getName());

Код:

Исходная ссылка

https://bitbucket.org/powder366/ejb/src/master/ 

Glassfi sh команды:

asadmin start-domain --verbose
asadmin stop-domain --verbose 
http://localhost:8080/
http://localhost:4848/common/index.jsf
mvn package
asadmin deploy ejb-1.0-SNAPSHOT.jar

Скриншоты:

enter image description here enter image description here

Примечание:

My контрольные примеры работают со встроенным контейнером, но я не могу назвать свой внешний работающий контейнер.

Используемые версии: Java8, EJB3.0, Glassfish5.0.1, Java EE8.0.1

Update1: Добавлен журнал во время деплиментного контейнера-deploy-log.txt , См. git remote.

Update2: Перенесенные рабочие изменения в git remote.

Update3: Пример перемещения MDB в git дистанционный.

1 Ответ

2 голосов
/ 22 апреля 2020

Прежде всего, если вы хотите получить доступ к вашему EJB с внешнего клиента, вам нужно объявить удаленное представление.

Поскольку ваш EJB имеет только аннотацию @Local, он предлагает только локальное представление , Вы должны добавить аннотацию @Remote.

@Local
@Remote
@Stateless
public class MyService implements IMyService {
    public String getMessage() {
        return "Hello!";
    }
}

Глобальное имя JNDI состоит из:

java:global/[EAR module]/[EJB module]/[EJB name]

, поскольку в вашем случае EAR отсутствует, это будет:

java:global/ejb-1.0-SNAPSHOT/MyService

Этот тест должен работать:

Context ctx = new InitialContext();
IMyService myService = (IMyService) ctx.lookup("java:global/ejb-1.0-SNAPSHOT/MyService");
Assert.assertEquals(myService.getMessage(), "Hello!");

ОБНОВЛЕНИЕ

Вам также необходимо добавить клиентские библиотеки glassfi sh в classpath к запустите класс Main.

Я изначально тестировал его с помощью теста JUnit, он работал для меня, потому что проект уже объявил зависимость test от glassfish-embeded-all, которая включает в себя клиент glassfi sh. Но IntelliJ не добавляет библиотеки test при запуске класса Main.

Вы можете либо изменить область действия glassfish-embeded-all на runtime, либо добавить новую зависимость:

<dependency>
    <groupId>org.glassfish.main.appclient</groupId>
    <artifactId>gf-client</artifactId>
    <version>5.1.0</version>
    <scope>runtime</scope>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...