XML-дескриптор развертывания — альтернатива аннотациям, а это означает, что у любой аннотации имеется эквивалентный XML-тег. При одновременном использовании аннотаций и дескрипторов развертывания настройки в дескрипторе развертывания возьмут верх над аннотациями во время процесса развертывания. Я не стану вдаваться в подробности, описывая структуру XML-дескриптора развертывания (с именем ejb-jar.xml), поскольку он является необязательным и может оказаться очень многословным. В качестве примера в листинге 7.18 показано, как мог бы выглядеть файл ejb-jar.xml, связанный с ItemEJB (который был показан ранее в листинге 7.2). Он определяет класс EJB-компонента, удаленный и локальный интерфейсы, его тип (Stateless). Кроме того, здесь имеет место транзакция, управляемая контейнером (CMT) (Container).
·········xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
·········xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
·········http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"
·········version="3.2">
··
····
······
······
······
······
······
······
······
····
··
Если вы решите произвести развертывание сессионного EJB-компонента в файле с расширением. jar, то вам потребуется сохранить дескриптор развертывания в файле META-INF/ejb-jar.xml. А при развертывании сессионного EJB-компонента в файле с расширением. war вам придется сохранить дескриптор развертывания в файле WEB-INF/ejb-jar.xml. XML-конфигурация описывает детали, специфичные для среды, и не должна указываться в коде с помощью аннотаций (например, если EJB-компонент необходимо задействовать одним путем в среде разработки и другим путем — в средах тестирования/производства).
Контекст именования среды
При работе с корпоративными приложениями возникают ситуации, в которых параметры вашего приложения изменяются от одного развертывания к другому (в зависимости от страны, в которой вы его развертываете, версии приложения и т. д.). Например, в приложении CD-BookStore ItemEJB (листинг 7.19) преобразует цену элемента в стоимость в валюте страны, в которой развернуто приложение (с применением changeRate на основе курса доллара). Если вы решите произвести развертывание этого EJB-компонента где-то в Европе, то вам потребуется умножить цену элемента на 0,80 и изменить валюту на евро.
@Stateless
public class ItemEJB {
··public Item convertPrice(Item item) {
····item.setPrice(item.getPrice() * 0.80F);
····item.setCurrency("Euros");
····return item;
··}
}
Как вы можете понять, проблема жесткого кодирования этих параметров заключается в том, что вам придется изменить свой код, перекомпилировать его и заново произвести развертывание компонента для каждой страны, в которой валюта будет уже другой. Иной вариант заключается в доступе к базе данных каждый раз, когда вы вызываете метод convertPrice(). Однако это будет расточительством ресурсов. Что вам действительно нужно сделать, так это сохранить соответствующие параметры где-нибудь, чтобы вы смогли изменить их во время развертывания. Дескриптор развертывания — идеальное место для задания этих параметров.
Может, дескриптор развертывания (ejb-jar.xml) и опционален в EJB 3.2, но его допустимо использовать в случае с записями окружения. Они указываются в дескрипторе развертывания и доступны с помощью внедрения зависимостей (или JNDI). Записи окружения поддерживают следующие Java-типы: String, Character, Byte, Short, Integer, Long, Boolean, Double и Float. В листинге 7.20 приведен файл ejb-jar.xml, связанный с ItemEJB, который определяет две записи: currencyEntry типа String со значением Euros и changeRateEntry типа Float со значением 0.80.
·········xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
·········xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/javaee