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
相关产品推荐
相关产品推荐

