2011-01-12 8 views
4

Использование Glassfish 3.0.1 ... Если у меня есть веб-приложение, обращающееся к EJB в другом приложении удаленно, а удаленное приложение, содержащее EJB, перераспределяется, я получаю javax.ejb.NoSuchEJBException (см. таблицу ниже).javax.ejb.NoSuchEJBException после повторного развертывания EJB

Не должно ли это работать? Я вижу, что рассматриваемый EJB был успешно развернут с использованием того же самого JNDI-имени.

Есть ли другой способ исправить это, чем перезапустить веб-приложение? Следует отметить, что в данном конкретном примере, что StackTrace от, я доступ к сервлет, который впрыскивает боб с CDI:

public class StatusServlet extends HttpServlet { 

    @Inject 
    private StatusService statusService; 

    @Override 
    public void doGet(final HttpServletRequest req, final HttpServletResponse res) throws IOException { 
     res.getWriter().write(statusService.getStatus()); 
    } 
} 

Инъекция делается с помощью следующего производителя, чтобы получить право EJB:

public class StatusServiceProducer extends AbstractServiceProducer { 

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

@Produces 
public StatusService getService(final InjectionPoint ip) { 
    return service; 
} 

} 

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

интерфейс и Реализация StatusService выглядит следующим образом:

@Stateless(name = "StatusService") 
public class StatusServiceImpl implements StatusService { 
    private static final String OK = "OK"; 

    public String getStatus() { 
     // Some code 
     return OK; 
    } 
} 
public interface StatusService { 
String getStatus(); 
} 

Edit: При условии, мой собственный возможный solution. Есть ли лучший?


Полный StackTrace:

[#|2011-01-12T10:45:28.273+0100|WARNING|glassfish3.0.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=50;_ThreadName=http-thread-pool-8080-(1);|StandardWrapperValve[Load 
Balancer status servlet]: PWC1406: Servlet.service() for servlet Load 
Balancer status servlet threw exception 
javax.ejb.NoSuchEJBException 
     at org.example.service._StatusService_Wrapper.getStatus(org/example/service/_StatusService_Wrapper.java) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at no.evote.service.cache.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:34) 
     at $Proxy760.getStatus(Unknown Source) 
     at no.evote.presentation.StatusServlet.doGet(StatusServlet.java:25) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
     at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 
     at net.balusc.http.multipart.MultipartFilter.doFilter(MultipartFilter.java:78) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
     at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
     at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
     at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
     at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
     at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
     at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
     at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
     at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
     at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
     at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
     at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
     at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: java.rmi.NoSuchObjectException: CORBA OBJECT_NOT_EXIST 
1330446338 No; nested exception is: 
     org.omg.CORBA.OBJECT_NOT_EXIST: ----------BEGIN server-side stack 
trace---------- 
org.omg.CORBA.OBJECT_NOT_EXIST: vmcid: OMG minor code: 2 completed: No 
     at com.sun.corba.ee.impl.logging.OMGSystemException.noObjectAdaptor(OMGSystemException.java:3457) 
     at com.sun.corba.ee.impl.logging.OMGSystemException.noObjectAdaptor(OMGSystemException.java:3475) 
     at com.sun.corba.ee.impl.oa.poa.POAFactory.find(POAFactory.java:222) 
     at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.findObjectAdapter(CorbaServerRequestDispatcherImpl.java:450) 
     at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:209) 
     at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1841) 
     at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:119) 
     at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:235) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:187) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:147) 
     at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:225) 
     at no.evote.service.__StatusService_Remote_DynamicStub.getStatus(no/evote/service/__StatusService_Remote_DynamicStub.java) 
     at no.evote.service._StatusService_Wrapper.getStatus(no/evote/service/_StatusService_Wrapper.java) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at no.evote.service.cache.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:34) 
     at $Proxy760.getStatus(Unknown Source) 
     at no.evote.presentation.StatusServlet.doGet(StatusServlet.java:25) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
     at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 
     at net.balusc.http.multipart.MultipartFilter.doFilter(MultipartFilter.java:78) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
     at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
     at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
     at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
     at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
     at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
     at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
     at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
     at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
     at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
     at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
     at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
     at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: org.omg.PortableServer.POAPackage.AdapterNonExistent: 
IDL:omg.org/PortableServer/POA/AdapterNonExistent:1.0 
     at com.sun.corba.ee.impl.oa.poa.POAImpl.find_POA(POAImpl.java:1057) 
     at com.sun.corba.ee.impl.oa.poa.POAFactory.find(POAFactory.java:218) 
     ... 48 more 

----------END server-side stack trace---------- vmcid: OMG minor 
code: 2 completed: No 
     at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:280) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:200) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:147) 
     at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:225) 
     at no.evote.service.__StatusService_Remote_DynamicStub.getStatus(no/evote/service/__StatusService_Remote_DynamicStub.java) 
     ... 39 more 
Caused by: org.omg.CORBA.OBJECT_NOT_EXIST: ----------BEGIN server-side 
stack trace---------- 
org.omg.CORBA.OBJECT_NOT_EXIST: vmcid: OMG minor code: 2 completed: No 
     at com.sun.corba.ee.impl.logging.OMGSystemException.noObjectAdaptor(OMGSystemException.java:3457) 
     at com.sun.corba.ee.impl.logging.OMGSystemException.noObjectAdaptor(OMGSystemException.java:3475) 
     at com.sun.corba.ee.impl.oa.poa.POAFactory.find(POAFactory.java:222) 
     at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.findObjectAdapter(CorbaServerRequestDispatcherImpl.java:450) 
     at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:209) 
     at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1841) 
     at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:119) 
     at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:235) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:187) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:147) 
     at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:225) 
     at no.evote.service.__StatusService_Remote_DynamicStub.getStatus(no/evote/service/__StatusService_Remote_DynamicStub.java) 
     at no.evote.service._StatusService_Wrapper.getStatus(no/evote/service/_StatusService_Wrapper.java) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at no.evote.service.cache.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:34) 
     at $Proxy760.getStatus(Unknown Source) 
     at no.evote.presentation.StatusServlet.doGet(StatusServlet.java:25) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
     at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 
     at net.balusc.http.multipart.MultipartFilter.doFilter(MultipartFilter.java:78) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
     at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
     at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
     at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
     at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
     at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
     at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
     at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
     at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
     at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
     at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
     at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
     at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: org.omg.PortableServer.POAPackage.AdapterNonExistent: 
IDL:omg.org/PortableServer/POA/AdapterNonExistent:1.0 
     at com.sun.corba.ee.impl.oa.poa.POAImpl.find_POA(POAImpl.java:1057) 
     at com.sun.corba.ee.impl.oa.poa.POAFactory.find(POAFactory.java:218) 
     ... 48 more 

----------END server-side stack trace---------- vmcid: OMG minor 
code: 2 completed: No 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.sun.corba.ee.impl.protocol.giopmsgheaders.MessageBase.getSystemException(MessageBase.java:913) 
     at com.sun.corba.ee.impl.protocol.giopmsgheaders.ReplyMessage_1_2.getSystemException(ReplyMessage_1_2.java:129) 
     at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.getSystemExceptionReply(CorbaMessageMediatorImpl.java:681) 
     at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.processResponse(CorbaClientRequestDispatcherImpl.java:510) 
     at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:153) 
     at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:235) 
     at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:187) 
     ... 42 more 
|#] 
+0

Как выглядит StatusService? Я считаю, что CDI создает прокси для EJB, но после перераспределения этот прокси-сервер больше не работает. AFAIK CDI не подходит для удаленных пользователей. Не можете ли вы просто ввести EJB с помощью @EJB вместо @Inject? – amorfis

+0

@amorfis: да, вы правы ... мы используем EJB, см. Код производителя, который я добавил. Что касается оригинальной проблемы, я считаю, что это объясняется здесь: http://www.java.net/forum/topic/glassfish/glassfish/redeploy-tree-0 См. Также: http://www.java.net/ форум/тема/glassfish/glassfish/javaxejbnosuchejbexception-after-redeplo – Vetle

ответ

1

С discussion на Glassfish форумах:

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

Так корень проблемы в том, что ссылка на EJB является несвежий. Я нашел два решения этой проблемы:

  1. Посмотрите на EJB на каждом запросе (не используйте CDI)
  2. Wrap EJBs в прокси-сервер, который смотрит вверх EJB, если ссылка несвежий

Со вторым решением CDI все еще можно использовать. Вам понадобится производитель и InvocationHandler. Код ниже - это упрощенная версия кода, который я использую в своем проекте, и он может не компилироваться должным образом, но он покажет идею и концепции, используемые при выполнении этой работы. YMMV.

Во-первых, в коде, который использует EJB, вы используете @Inject следующим образом:

public class Foo { 
    @Inject 
    MyEjb obj; 
} 

Во-вторых, вам нужен продюсер, который просто возвращает упакованную версию EJB:

public class MyEjbProducer { 
    @EJB(name = "MyEjb") 
    private MyEjb obj; 

    @Produces 
    public MyEjb getEjb(final InjectionPoint ip) { 
     InvocationHandler handler = new MyInvocationHandler(obj, MyEjb.class); 
     return (MyEjb)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler); 
    } 
} 

в-третьих, обработчик вызова должен проверить NoSuchEjbException и посмотреть вверх боб снова:

public class MyInvocationHandler implements InvocationHandler { 
    private MyEjb obj; 
    private Class lookupClass; 

    public MyInvocationHandler(MyEjb obj, Class lookupClass) { 
     this.obj = obj; 
     this.lookupClass = lookupClass; 
    } 

    public Object invoke (...) { 
     try { 
      return method.invoke(impl, args); 
     } catch (final InvocationTargetException e) { 
      if (e.getTargetException() instanceof NoSuchEJBException) { 
       // 1. look up EJB again 
       // 2. try calling invoke again      
      } 
     } 
    } 
} 

Этот код ни в коем случае не является полным. Некоторые из кода, такие как поиск EJB и вызов метода снова, были опущены.

Выполнение этого способа будет работать. Другим методом было бы сделать что-то подобное, но добавив отдельный EJB-метод для проверки на стойкость, вместо того, чтобы использовать метод, который пользователь пытается вызвать.

Как вы думаете? Есть ли лучшее решение?

+1

Должен работать из GF 3.1, см. мой ответ. – ymajoros

2

Единственным решением было бы не использовать @EJB-инъекцию в качестве поля в сервлете (где он вводится при загрузке класса, поэтому запуск приложения или первое использование сервлета, а скорее запрос нового экземпляра для каждого запроса . к сожалению, это означает, что вы не можете использовать инъекции @EJB аннотацию и будет обрабатывать EJB старым способом, используя JNDI поиск и т.д.

Смежные вопросы