You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMS 2.0中EJB注入JMSContext为空的技术问题求助

解决JMSContext始终为null的问题

嘿,作为JMS 2.0新手遇到这个问题太正常了,我帮你一步步拆解排查可能的原因:

1. 先确认你的类是容器管理的Bean

@Inject和@Resource这类依赖注入注解只有在容器管理的组件中才会生效,比如:

  • EJB(标注@Stateless、@Stateful、@Singleton)
  • CDI Bean(标注@Named、@ApplicationScoped、@RequestScoped等)

如果你的类是普通Java类,自己通过new实例化的,容器根本不会处理这些注入注解,自然JMSContext和Queue都会是null。

给你个修正后的示例,把类改成无状态EJB:

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.jms.JMSConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.Queue;
import javax.annotation.Resource;

@Stateless
public class MessageSenderBean {
    @Resource(mappedName = "jms/dest") 
    private Queue dest; 

    @Inject 
    @JMSConnectionFactory("jms/queue") 
    private JMSContext context ; 

    public void sendJMSMessageToDest(String messageData) {
        System.out.println("Msg = "+messageData ); 
        System.out.println("Dest = "+dest ); 
        System.out.println("Context = " +context); 
        context.createProducer().send(dest, messageData); 
    }
}

2. 检查JMS资源的JNDI名称是否完全匹配

  • 确认你在应用服务器中配置的连接工厂JNDI名称就是jms/queue——很多容器默认的连接工厂JNDI名是jms/ConnectionFactory,如果配置的是这个,你的注解要改成@JMSConnectionFactory("jms/ConnectionFactory")。
  • 同样,队列的mappedName = "jms/dest"也要和容器中配置的队列JNDI名完全一致,大小写、前缀后缀都不能错。

3. 别在构造方法里调用发送逻辑

如果你的sendJMSMessageToDest是在类的构造方法里调用的,这时候容器还没完成依赖注入,JMSContext肯定是null。你可以把发送逻辑放在@PostConstruct注解的方法里,或者在外部通过容器获取Bean实例后再调用:

@PostConstruct
public void init() {
    sendJMSMessageToDest("Hello JMS!");
}

4. 确认运行环境支持Java EE/JMS 2.0

你得在Java EE兼容的应用服务器上运行代码,比如WildFly、Payara、GlassFish这些。如果是普通Java SE环境,@Inject不会自动生效,这时候得手动创建JMSContext:

// Java SE环境下的替代写法
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.Queue;
import javax.naming.InitialContext;

public class MessageSender {
    public static void main(String[] args) throws Exception {
        InitialContext ctx = new InitialContext();
        ConnectionFactory cf = (ConnectionFactory) ctx.lookup("jms/queue");
        Queue dest = (Queue) ctx.lookup("jms/dest");
        
        try (JMSContext context = cf.createContext()) {
            context.createProducer().send(dest, "Hello JMS!");
        }
    }
}

先从上面几点排查,最常见的问题就是类不是容器管理Bean,或者JNDI名称不匹配。

内容的提问来源于stack exchange,提问作者Rahul Choudhary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:18