2012-06-15 109 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 JSR 318規範的EJB 3.1中的新增功能。

+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