получить доступ к локальному сессионному компоненту из другого EAR? - PullRequest
2 голосов
/ 15 апреля 2011

Как я могу вызвать локальный сессионный компонент внутри EAR из другого EAR, оба развернут в том же домене Glassfish v3?

Это структура:

Glassfish v3 Domain1

    EAR1
            EAR1-EJB.jar
                    class TestSessionBean           <-- @Stateless
            common.jar
                    interface TestSessionLocal      <-- @Local

    EAR2
            EAR2-EJB.jar
                    class TestSessionBeanClient     <-- @Singleton, @LocalBean
            common.jar
                    interface TestSessionLocal      <-- @Local

TestSessionBean реализует TestSessionLocal, оба EAR имеют common.jar.

Мне нужно использовать TestSessionBean из TestSessionBeanClient. Я хотел бы взять преимущество локального сессионного компонента из-за производительности.

Я знаю, что не могу использовать простой вызов @EJB в TestSessionBeanClient, поэтому я попытался чтобы искать вот так:

InitialContext ic = new InitialContext();
TestSessionLocal tsl = ic.lookup("java:global/EAR1/EAR1-EJB/TestSessionBean!org.test.TestSessionLocal");

Это вызовет исключение ClassCastException, поскольку возвращаемый объект не будет TestSessionLocal, но прокси-класс, такой как:

TestSessionLocal_1389930137

что для того, чтобы вызвать его методы, я должен подумать, чтобы найти его методы.

Пожалуйста, помогите.

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 16 апреля 2011

Согласно 3.2.2 спецификации EJB 3.1:

Доступ к корпоративному компоненту через представление локального клиента требуется только для локальных клиентов, упакованных в том же приложении, что и корпоративный компонент.это обеспечивает представление локального клиента.Совместимые реализации этой спецификации могут дополнительно поддерживать доступ к локальному клиентскому представлению корпоративного компонента из локального клиента, упакованного в другое приложение.Требования к конфигурации для доступа между приложениями к представлению локального клиента зависят от поставщика и выходят за рамки данной спецификации.Приложения, использующие межприкладной доступ к представлению локального клиента, являются непереносимыми.

Вот часто задаваемые вопросы по GlassFish: У меня есть компонент EJB с локальным интерфейсом.Могу ли я получить к нему доступ из веб-компонента в другом приложении?

(Тем не менее, вы можете попробовать упаковать ваш интерфейс так, чтобы он загружался ClassLoader, который является общим для обоих приложений.)

4 голосов
/ 16 апреля 2011

Вы действительно не хотите этого делать.как говорится в другом ответе, поддержка не требуется.одна из многих причин, по которой он проблематичен, заключается в том, что он может вызвать проблемы с загрузчиком классов.если у вас есть классы в одном ухе со ссылками на классы в другом ухе, могут произойти все виды плохих вещей (например, наличие ссылок на кросс-загрузчик, которые станут недействительными, если другое ухо будет перераспределено).

0 голосов
/ 21 декабря 2012

Это первое сообщение, которое я публикую на Stackoverflow, но признаюсь, что часто его читаю.Кстати, заранее извините за мой английский.

Я думаю, что нашел альтернативное решение этой проблемы:

Я пометил свой EJB с помощью @Remote, и вот мой конфиг sun-ejb.

sun-ejb-jar.xml

  <ejb>
    <ejb-name>XXX</ejb-name>

    <ior-security-config>
        <transport-config>
            <integrity>required</integrity> 
            <confidentiality>required</confidentiality>
            <establish-trust-in-target>supported</establish-trust-in-target>
            <establish-trust-in-client>required</establish-trust-in-client>
        </transport-config>

        <sas-context>
            <caller-propagation>supported</caller-propagation>
        </sas-context>
    </ior-security-config>
  </ejb>

После некоторых тестов выясняется, что EJB не доступен клиенту без известного сертификата.Другие EAR могут получить доступ к этому EJB без какой-либо аутентификации.

Редактировать: я пробовал решение ClassLoader, но оно не подходит для моего проекта

...