【问题标题】:How to specify name for resource annotations in compile time?如何在编译时为资源注释指定名称?
【发布时间】:2010-01-18 22:02:08
【问题描述】:

我们的代码是这样的:

@Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE")
private Queue queue;

但是,在一种部署方案中,队列注释应该如下所示:

@Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE")
private Queue queue;

我想选择用于 Maven 构建配置文件的名称。

我有什么选择?

【问题讨论】:

    标签: java ejb-3.0


    【解决方案1】:

    这不是做事的正确方式。资源应该添加到各个 EJB 的 本地 jndi 名称。这是为了将 bean 代码中使用的 jndi 名称与 bean 部署程序设置的 global jndi bindings 分开。 bean local jndi bindingglobal binding 的映射可以通过 ejb-jar.xml 和 appserver-specific 部署描述符来处理。

    因此,您应该像这样声明您的@Resource(相当于<resource-ref> 元素,指示资源引用名称和类型):

    @Resource(name = "jms/queue/aQueue")
    private Queue queue;
    

    然后,在特定于应用服务器的部署描述符中(对于 GlassFish,它是 sun-ejb-jar.xml,对于 JBoss,它是 jboss.xml,对于 WebLogic,它是 weblogic-ejb-jar.xml,等等),声明一个 <resource-ref> 元素,指示资源引用名称和通过 <jndi-name> 元素进行全局 jndi 绑定。

    <resource-ref>
      <res-ref-name>jms/queue/aQueue</res-ref-name>
      <jndi-name>resource/foo/bar/ONE_QUEUE</jndi-name>
    </resource-ref>
    

    一旦你让整个事情工作起来,就可以很容易地使用 Maven 对这个特定于 appserver 的部署描述符进行变量化,以用于具有配置文件和过滤的不同环境。只需使用一个属性,激活资源过滤,并在配置文件中设置不同的值。类似的东西:

    <resource-ref>
      <res-ref-name>jms/queue/aQueue</res-ref-name>
      <jndi-name>${my.jndi.name}</jndi-name>
    </resource-ref>
    

    【讨论】:

      【解决方案2】:

      我认为你可以使用 maven 过滤,虽然感觉很奇怪。

      Here 是一篇关于这种方法的文章。

      【讨论】:

        【解决方案3】:

        如果您不想针对每个 bean 进行配置,您可以为此使用 JBoss Seam 功能(请参阅Seam reference doc)。我不知道这是否是 Java 依赖注入规范 (JSR-299) 的一部分(如果您担心供应商独立性)。

        编辑:显然它是 JSR-299 的一部分,请参阅 resin's doc about JSR-299

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2019-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多