Как указать имя для аннотации ресурса во время компиляции? - PullRequest
6 голосов
/ 18 января 2010

Наш код имеет что-то вроде этого:

@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 ]

10 голосов
/ 18 января 2010

Это не правильный способ делать вещи.Ресурсы должны быть добавлены к локальному имени jndi отдельных EJB.Это необходимо для отделения имени jndi, используемого в коде компонента, от глобальных привязок jndi , установленных средством развертывания компонента.Сопоставление локальной привязки bean jndi и глобальной привязки может обрабатываться с помощью дескрипторов развертывания ejb-jar.xml и appserver.

Вместо этого выдолжен объявить ваш @Resource (что эквивалентно элементу <resource-ref>, указывающему имя и тип ссылки на ресурс) следующим образом:

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

Затем в дескрипторе развертывания для конкретного приложения (для GlassFish это * 1017)*, для JBoss это jboss.xml, для WebLogic это weblogic-ejb-jar.xml и т. д.), объявите элемент <resource-ref>, указывающий имя ссылки на ресурс и глобальную привязку jndi через элемент <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 для различных сред с профилями и фильтрацией.Просто используйте свойство, активируйте фильтрацию ресурсов и установите другое значение в профилях.Примерно так:

<resource-ref>
  <res-ref-name>jms/queue/aQueue</res-ref-name>
  <jndi-name>${my.jndi.name}</jndi-name>
</resource-ref>
1 голос
/ 18 января 2010

Я думаю, вы можете использовать maven filtering, хотя это будет странно.

Здесь - статья об этом подходе.

0 голосов
/ 18 января 2010

Если вы не хотите выполнять настройку для каждого компонента, вы можете использовать для этого функциональность JBoss Seam (см. Справочник по Seam ). Я не знаю, является ли это частью спецификации внедрения зависимостей Java (JSR-299) (если вы беспокоитесь о независимости поставщика).

РЕДАКТИРОВАТЬ: Очевидно, что это часть JSR-299, см. документация смолы о JSR-299

...