2012-06-15 2 views
0

По какой-то причине я должен использовать старый контейнер EJB GlassFish 2.1.1. (сертифицирован для Java EE 5 и EJB 3.0). Структура проекта заключается в следующем:EJB Зависимости неправильно подключены (впрыскиваются) на GlassFish 2.1

MDB:

@MessageDriven(
    mappedName = "jms/Queue", 
    activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", 
           propertyValue = "javax.jms.Queue")  
}) 
public class TriggerMBean implements MessageListener { 
    @EJB 
    private TriggerProcessor triggerService; 

    public void onMessage(Message message) { 
      //....... 
      triggerService.process(); 
      //....... 
    } 
} 

TriggerProcessor:

@Stateless 
public class TriggerProcessor { 
    public void proceess() { 
     //.... 
    } 
} 

Я не создан дескриптор развертывания. Как я понимаю, это не обязательно, если я использую аннотации и EJB версии, начиная с 3.0

При развертывании, исключением является следующее:

[#|2012-06-15T15:55:50.290+0300|SEVERE|sun-appserver2.1|javax.enterprise.system.container.ejb.mdb|_ThreadID=42;_ThreadName=p: thread-pool-1; w: 61;_RequestID=824fc411-7772-42cc-aeee-9a8d9b451dbf;|com.sun.enterprise.InjectionException 
com.sun.enterprise.InjectionException: Exception attempting to inject Unresolved Ejb-Ref fi.prh.novus.sync.consumer.TriggerMBean/[email protected]: [email protected]@[email protected]@null into class fi.prh.novus.sync.consumer.TriggerMBean 
     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.MessageBeanContainer.createMessageDrivenEJB(MessageBeanContainer.java:711) 
     at com.sun.ejb.containers.MessageBeanContainer.access$100(MessageBeanContainer.java:109) 
     at com.sun.ejb.containers.MessageBeanContainer$MessageBeanContextFactory.create(MessageBeanContainer.java:492) 
     at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:199) 
     at com.sun.ejb.containers.MessageBeanContainer._getContext(MessageBeanContainer.java:555) 
     at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1731) 
     at com.sun.ejb.containers.MessageBeanContainer.beforeMessageDelivery(MessageBeanContainer.java:1008) 
     at com.sun.ejb.containers.MessageBeanListenerImpl.beforeMessageDelivery(MessageBeanListenerImpl.java:70) 
     at com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:135) 
     at $Proxy86.beforeDelivery(Unknown Source) 
     at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:245) 
     at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:77) 
     at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555) 
Caused by: javax.naming.NameNotFoundException: fi.prh.novus.sync.service.TriggerProcessor#fi.prh.novus.sync.service.TriggerProcessor not found 
     at com.sun.enterprise.naming.TransientContext.doLookup(TransientContext.java:216) 
     at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:188) 
     at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74) 
     at com.sun.enterprise.naming.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:111) 
     at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:409) 
     at javax.naming.InitialContext.lookup(InitialContext.java:392) 
     at com.sun.enterprise.naming.NamingManagerImpl.lookup(NamingManagerImpl.java:951) 
     at com.sun.enterprise.naming.java.javaURLContext.lookup(javaURLContext.java:173) 
     at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:407) 
     at javax.naming.InitialContext.lookup(InitialContext.java:392) 
     at com.sun.enterprise.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:287) 
     ... 15 more 
|#] 

Я попытался аннотирования private TriggerProcessor triggerService; с @EJB(beanName="TriggerProcessor") и public class TriggerProcessor {.. с @Stateless(name="TriggerProcessor") но это не помогло.

На самом деле, это отлично работает на новейшей Glassfish 3.1., Но, как я сказал, я должен использовать GF 2.1.1.

Любая помощь приветствуется!

ответ

1

Он не работает, поскольку GlassFish 2 не поддерживает EJB 3.1. TriggerProcessor ony предлагает вид без интерфейса, поскольку он не реализует никакого интерфейса. Ваш должен обеспечить интерфейс для TriggerProcessor, чтобы он соответствовал EJB 3.0.

Только EJB 3.1 поддерживает вид без интерфейса. См. http://docs.oracle.com/cd/E19776-01/820-4496/beahm/index.html и глава 1.2 Что нового в EJB 3.1 спецификации JSR 318.

+0

Glassfish 2.1.x поддерживает EJB 3.0 http://glassfish.java.net/public/comparing_v2_and_v3.html – adrift

+0

Вы правы. Сожалею. Я исправил это. Но представление без интерфейса было представлено с EJB 3.1. – Oliver

+0

Большое спасибо за ответ! Не могли бы вы объяснить немного ближе? Должен ли я создать интерфейс и реализовать его с помощью TriggerProcessor и передать ссылку на интерфейс TriggerMBean? Как я должен аннотировать этот интерфейс? – adrift

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