Ошибка поиска JNDI EJB3 в клиенте приложения Java EE - PullRequest
2 голосов
/ 29 апреля 2010

Я пытаюсь получить доступ к EJB3 из клиентского приложения Java EE, но постоянно получаю только ошибки поиска. Клиентское приложение выполняется в контейнере клиента приложения Java EE.

Мое приложение Java EE 'CoreServer' предоставляет несколько компонентов с удаленными интерфейсами. У меня нет проблем с доступом к ним из веб-приложения, развернутого на том же Glassfish v3.0.1.

Теперь я пытаюсь получить к нему доступ из клиентского приложения:

public class Main {

  public static void main(String[] args) {
    CampaignControllerRemote bean = null;

    try {
        InitialContext ctx = new InitialContext();
        bean = (CampaignControllerRemote) ctx.lookup("java:global/CoreServer/CampaignController");

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if (bean != null) {
        Campaign campaign = bean.get(361);
        if (campaign != null) {
            System.out.println("Got "+ campaign);
        }
    }
  }

}

Когда я запускаю развертывание на Glassfish и запускаю его из приложения, я получаю эту ошибку:

Lookup failed for 'java:global/CoreServer/CampaignController' in SerialContext targetHost=localhost,targetPort=3700,orb'sInitialHost=localhost,orb'sInitialPort=3700

Однако это то же самое имя JNDI, которое я использую при поиске компонента из WebApplication (через SessionContext, а не InitialContext - имеет ли это значение?). Кроме того, когда я развертываю 'CoreServer', Glassfish сообщает:

Portable JNDI names for EJB CampaignController : [java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote, java:global/CoreServer/CampaignController]
Glassfish-specific (Non-portable) JNDI names for EJB CampaignController : [mvs.api.CampaignControllerRemote, mvs.api.CampaignControllerRemote#mvs.api.CampaignControllerRemote]

Я перепробовал все четыре имени, ни одно не сработало. Не может ли приложение получить доступ к компонентам с (только) удаленными интерфейсами?

Ответы [ 4 ]

1 голос
/ 19 мая 2010

Если вы говорите о клиенте приложения, используйте этот ответ:

Не беспокойся о поиске jndi; Вы можете использовать @EJB-инъекцию в статические поля класса приложения.

1 голос
/ 19 мая 2010

Вы пробовали java: global / CoreServer / CampaignController! Mvs.api.CampaignControllerRemote вместо java: global / CoreServer / CampaignController ?

0 голосов
/ 21 мая 2010
0 голосов
/ 19 мая 2010

Если вы говорите об автономном клиенте, используйте этот ответ:

Вот метод, который я использую для поиска JNDI для Glassfish v2, он может быть очень похож на v3:

private void lookupJndi() {
    final Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory");
    String host = "hostname.domain";
    logger.log(Level.INFO, "Connecting to CORBA Host: " + host);
    props.setProperty("org.omg.CORBA.ORBInitialHost", host);
    try {
        InitialContext ic = new InitialContext(props);
        scheduleManager = (ScheduleManagerRemote) ic.lookup("ScheduleManagerRemote");
        experimentManager = (ExperimentManagerRemote) ic.lookup("ExperimentManager");
        facilityManager = (FacilityManagerRemote) ic.lookup("FacilityManager");
    } catch (NamingException e) {
        ...
    }

Ключевой частью является получение com.sun INITIAL_CONTEXT_FACTORY. Также убедитесь, что у вас есть все зависимости glassfish от вашего приложения. Для Glassfish v2 их много. Файлы v2: javaee, appserv-rt, appserv-ext, appserv-admin, appserv-deploy-client.

С v3 все может быть намного проще, но это определенно работает для v2.x

...