Jndi Lookup в EJB и в его зависимостях - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть приложение Java, развернутое на Websphere 8.5 как EAR.Я пытаюсь выяснить, как сделать поиск JNDI из ejb-jar.xml.(Noob to EJB) Я обычно делаю поиск записей JNDI из WAR, добавляя записи в web.xml.Теперь, работая над модулем ejb, я понял, что все еще могу выполнять поиск JNDI в компоненте ejb [1].Смотрите ниже мой ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?><ejb-jar id="ejb-jar_ID" version="2.1"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
<display-name>MyService-ejb</display-name>
<enterprise-beans>
    <message-driven id="MyServiceSyncOutboundCom">
        <ejb-name>MyServiceSyncOutboundcom</ejb-name>
        <ejb-class>
            com.company.MyService.sync.com.MyServiceSyncOutboundCom
        </ejb-class>
        <transaction-type>Container</transaction-type>
        <message-destination-type>
            javax.jms.Queue
        </message-destination-type>
        <env-entry>
             <env-entry-name>minBalance</env-entry-name>
             <env-entry-type>java.lang.Integer</env-entry-type>
             <env-entry-value>500</env-entry-value>
        </env-entry>
        <env-entry>
        <description></description>
             <env-entry-name>maxCreditBalance</env-entry-name>
             <env-entry-type>java.lang.Integer</env-entry-type>
             <env-entry-value>10000</env-entry-value>
        </env-entry>
    </message-driven>
</enterprise-beans>


Мой вопрос: Как я могу получить эти записи в моем классе, когда у меня нет web.xml?Также, если модуль ejb содержит зависимость JAR, скажем, myservice-config.jar с классом Configs, могу ли я получить эти записи в этом классе вместо моего компонента, управляемого сообщениями?Как это изменит файл ejb-jar.xml тогда?
[1] https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servjndi008.htm

1 Ответ

0 голосов
/ 11 апреля 2019

Файл ejb-jar.xml служит тем же целям для EJB, что и файл web.xml для сервлетов.Синтаксис XML для внедрения в EJB такой же, как синтаксис XML для внедрения в сервлет, за исключением того, что в ejb-jar.xml он вложен в корпоративный компонент, а не только на уровне модуля.Из вашего примера это будет примерно так:

<env-entry>
    <env-entry-name>minBalance</env-entry-name>
    <env-entry-type>java.lang.Integer</env-entry-type>
    <env-entry-value>500</env-entry-value>
    <injection-target>
        <injection-target-class>com.company.MyService.sync.com.MyServiceSyncOutboundCom</injection-target-class>
        <injection-target-name>name of field or method</injection-target-name>
    </injection-target>
</env-entry>

Вы можете внедрять только те классы, которые будут созданы контейнером;так, например, сервлеты создаются веб-контейнером;Экземпляры и перехватчики EJB создаются контейнером EJB.

Ваш класс Configs не является классом, управляемым контейнером, поэтому не может быть целью внедрения.Я могу придумать пару вариантов, которые все еще могут быть добавлены в него:

1 - В вашем ejb-jar.xml просто объявите его как синглтон-бин;затем введите ваши env-entry значения в него.Затем вы можете внедрить одноэлементный компонент Configs в другие компоненты.Хотя, возможно, нестандартно, ejb-jar.xml может объявить любой класс в пути к классам приложения как EJB.

2 - Объявить Confg как управляемый компонент CDI и использовать аннотацию @Inject.CDI не имеет ничего подобного web.xml или ejb-jar.xml, поэтому вам придется использовать аннотации при использовании CDI.

...