9

我无法javax.jms.ConnectionFactory注入我的独立 JMS 客户端。我在下面的代码中得到了java.lang.NullPointerException一个connectionFactory.createConnection()

JmsClient.java

public class JmsClient {

    @Resource(mappedName="jms/QueueConnectionFactory")
    private static ConnectionFactory connectionFactory;    

    @Resource(mappedName="jms/ShippingRequestQueue")
    private static Destination destination;

    public static void main(String[] args) {        
        try {
            Connection connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(destination);
            ObjectMessage message = session.createObjectMessage();

            ShippingRequestQueue shippingRequest = new ShippingRequestQueue(1, "107, Old Street");

            message.setObject(shippingRequest);
            producer.send(message);
            session.close();
            connection.close();

            System.out.println("Shipping request message sent ..");
        } catch (Throwable ex) {
            ex.printStackTrace();
        }        
    }

}

我使用 Glassfish 3.1 管理控制台在Open MQ (MoM) 创建了相应的连接工厂和目标资源。

有人可以帮我理解我错过了什么吗?

4

2 回答 2

7

资源注入仅适用于托管环境,例如 Java EE 应用程序服务器或 Spring 容器。在独立应用程序中,JNDI 是您唯一的选择

通常,注释意味着由某些工具/框架处理,而执行您的main()方法的普通 JVM 根本不包含此类。我所知道的由 JVM 开箱即用处理的唯一注释是 compile- time@Deprecated和.@Override@SuppressWarnings

回复您的评论:我无法访问这本书,所以我只能猜测它们可能描述了运行应用程序客户端组件不是 独立应用程序客户端。不一样 —查看 Glassfish EJB 常见问题解答。ACC 通常部署到应用程序服务器中,可以通过 Java Web Start 或不通过它执行,但以特定于 AS 的方式执行。请参阅Glassfish 示例(您没有说您的 EJB 执行什么 AS)。

于 2011-09-23T10:46:31.407 回答
1

@skip:试试 @Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

name=JNDI 名称,根据 javax.annotation.Resource java doc。

于 2011-09-08T12:55:01.093 回答