EJB-зависимая инъекция удаленного сервиса завершается неудачно на Glassfish - PullRequest
3 голосов
/ 23 сентября 2010

Мне не удается заставить внедрение зависимостей работать для моей удаленной службы, и я не могу понять, почему. Мне нужен экземпляр RemoteService, поэтому я написал.

@EJB(name="RemoteService")
private RemoteService service;

И сам Бин определяется с помощью mappedName = "RemoteService:

@Stateless(mappedName = "RemoteService")
public class RemoteServiceBean implements RemoteService

Когда я пытаюсь запустить этот код, я получаю InjectionException:

EJB5070: Exception creating stateless session bean : [{0}]
com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref RemoteService@jndi: service.remote.RemoteService@null@service.remote.RemoteService@Session@null into class service.OrderServiceBean
        at com.sun.enterprise.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:387)
        at com.sun.enterprise.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:206)
        at com.sun.enterprise.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:127)
        at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:538)
        at com.sun.ejb.containers.StatelessSessionContainer.access$100(StatelessSessionContainer.java:111)
        at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:783)
        at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:199)
        at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:489)
        at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1709)
        at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1238)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:195)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:83)
        at $Proxy766.size(Unknown Source)
        at 

У меня нет конфигурационных файлов ejb, но они мне не нужны, верно? Удаленный сервис работает на том же экземпляре glassfish, что и сервис, пытающийся ссылаться на него. Проверка браузера JNDI в администраторе glassfish подтверждает, что EJB был развернут с правильным именем jndi, и если я удаляю аннотацию @EJB и выполняю поиск вручную в конструкторе, он также работает:

public OrderServiceBean()
  {
    try
    {
      final Properties properties = new Properties();
      properties.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
      properties.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
      properties.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
      properties.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
      properties.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

      final InitialContext initialContext = new InitialContext(properties);
      this.service = (RemoteService) initialContext.lookup("RemoteService");
    }

Идеи

1 Ответ

2 голосов
/ 24 сентября 2010

Не могу поверить, что не пробовал, но, похоже, не пробовал, очевидно, я не пытался ссылаться на EJB через mappedNameТаким образом, изменение ссылки на это заставляет его работать:

@EJB(mappedName="RemoteService")
private RemoteService service;
...