代码之家  ›  专栏  ›  技术社区  ›  tputkonen

如何在编译时为资源注释指定名称?

  •  6
  • tputkonen  · 技术社区  · 15 年前

    我们的代码是这样的:

    @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构建概要文件一起使用的名称。

    我有什么选择?

    3 回复  |  直到 15 年前
        1
  •  10
  •   Pascal Thivent    15 年前

    这不是正确的做事方式。应将资源添加到 本地JNDI名称 单个EJB的。这是为了将bean代码中使用的JNDI名称与 全局JNDI绑定 由bean部署者设置。bean的映射 本地JNDI绑定 以及 全局绑定 可通过 ejb-jar.xml 以及特定于AppServer的部署描述符。

    所以,你应该声明 @Resource (相当于 <resource-ref> 指示资源引用名称和类型的元素)如下所示:

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

    然后,在特定于AppServer的部署描述符中(对于Glassfish,它是 sun-ejb-jar.xml ,对于jboss来说 jboss.xml 对于Weblogic来说 weblogic-ejb-jar.xml 等),声明 <资源参考 元素,指示通过 <jndi-name> 元素。

    <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
  •  1
  •   Bozho    15 年前

    我认为你可以使用Maven过滤,尽管这会让人感觉很奇怪。

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

        3
  •  0
  •   Alexander Torstling    15 年前

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

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