【问题标题】:EJB Dependencies are not wired (injected) properly on GlassFish 2.1EJB 依赖项在 GlassFish 2.1 上未正确连接(注入)
【发布时间】:2012-06-18 13:30:32
【问题描述】:

出于某种原因,我应该使用旧的 EJB 容器 GlassFish 2.1.1。 (通过 Java EE 5 和 EJB 3.0 认证)。项目结构如下:

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();
          //.......
     }
}

触发器处理器:

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

我还没有创建部署描述符。据我了解,如果我从 3.0 开始使用注释和 EJB 版本,则没有必要

部署时出现以下异常:

[#|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/triggerService@jndi: fi.prh.novus.sync.service.TriggerProcessor@null@fi.prh.novus.sync.service.TriggerProcessor@Session@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
|#]

我尝试用@EJB(beanName="TriggerProcessor") 注释private TriggerProcessor triggerService;,用@Stateless(name="TriggerProcessor") 注释public class TriggerProcessor {..,但没有帮助。

实际上,这在最新的 Glassfish 3.1 上完美运行。但正如我珍贵地告诉的那样,我应该使用 GF 2.1.1。

任何帮助表示赞赏!

【问题讨论】:

    标签: java glassfish jms ejb-3.0


    【解决方案1】:

    由于 GlassFish 2 不支持 EJB 3.1,它无法工作。 TriggerProcessor 仅提供无接口视图,因为它不实现任何接口。您必须为 TriggerProcessor 提供一个接口以符合 EJB 3.0。

    只有 EJB 3.1 支持无接口视图。请参阅 http://docs.oracle.com/cd/E19776-01/820-4496/beahm/index.html 和 JSR 318 规范的1.2 EJB 3.1 中的新增功能一章。

    【讨论】:

    • Glassfish 2.1.x 确实支持 EJB 3.0 glassfish.java.net/public/comparing_v2_and_v3.html
    • 你是对的。对不起。我纠正了这一点。但是无接口视图是在 EJB 3.1 中引入的。
    • 非常感谢您的回复!你能解释一下吗?我应该创建一个接口并通过TriggerProcessor实现它,并将接口引用传递给TriggerMBean吗?我应该如何注释这个界面?
    • 我将为处理器创建一个接口并使用@Local 注释对其进行注释。可以试试吗?
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 2016-06-25
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多