Внедрение компонентов EJB3.0 в компоненты поддержки JSF2.0 ... Невозможно? - PullRequest
4 голосов
/ 08 июня 2011

Я работаю над проектом JSF на Weblogic 11g, и наш первоначальный проект требует, чтобы JSF Backing Beans вызывал EJB3.0 bean-компоненты для выполнения бизнес-логики и вызовов доступа к данным.Похоже, аннотация @EJB не работает в моем проекте, когда я пытаюсь внедрить ссылку EJB на компонент поддержки.Всякий раз, когда я попадаю в класс, который я тестирую, конструктор для моего EJB никогда не вызывается, и я получаю NPE.Можно ли внедрить компонент EJB3.0 в компонент поддержки JSF?Есть ли другой способ, которым я должен вызывать EJB через компонент JSF Backing?Какова лучшая практика?

Ответы [ 5 ]

4 голосов
/ 08 июня 2011

I немного погуглил , и это действительно, кажется, известная проблема с Weblogic. Многие похожие темы остаются без ответа.

Я нашел этот блог , который подтверждает, что @EJB в Weblogic работает только для ресурсов, определенных web.xml, а не для JSF. В блоге также подробно описывается обходной путь с использованием ServletContextListener, что, по-моему, не намного лучше, чем с использованием JNDI.

Я также нашел эту тему OTN , которая подтверждает, что @EJB в Weblogic начал работать, когда модули EJB не включены в подкаталоги (см. Ответ, размещенный внизу, февраль 15, 2011 5:44 PM).

3 голосов
/ 13 июня 2011

Оказывается, это проблема Weblogic при развертывании чего-либо с использованием JSF и EJB. Я нашел этот пост на форумах Oracle, где объясняется, как заставить инъекцию @EJB работать в управляемых компонентах JSF с помощью Weblogic 11g:

EJB3.0 Инъекция в фасоль JSF Managed

UPDATE:

После слишком долгого вращения моих колес я вынужден отказаться от попыток ввести EJB-компонент в JSF ManagedBean на Weblogic 11g. Кажется, хорошо работает в Tomcat. Может быть, реализация EJB3 и JSF будет лучше в 12G ...

2 голосов
/ 16 октября 2014

Чтобы все заработало, вам нужно выполнить два шага:

  1. Разверните jsf-2.0.war как БИБЛИОТЕКУ, вы можете найти его /ORACLE_HOME/wlserver_10.3/common/deployable-libraries

enter image description here

  1. В вашем веб-проекте добавьте ссылку на библиотеку jsf-2.0.war в WEB-INF / weblogic.xml

        <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
    
        <wls:weblogic-version>10.3.3</wls:weblogic-version>
        <wls:context-root>your_context_app</wls:context-root>
    
        <wls:library-ref>
          <wls:library-name>jsf</wls:library-name>
          <wls:specification-version>2.0</wls:specification-version>
          <wls:implementation-version>1.0.0.0_2-0-2</wls:implementation-version>
          <wls:exact-match>true</wls:exact-match>
        </wls:library-ref>                      
    
    </wls:weblogic-web-app>
    

Я успешно проверил это в weblogic 10.3.3 и 10.3.5. Если как-то это не работает, попробуйте развернуть приложение как часть файла EAR.

1 голос
/ 11 февраля 2014

Существует альтернатива аннотации @EJB для обеспечения доступа к вашему локальному EJB-компоненту в веб-приложении JSF ManagedBean.Учитывая, что ваши EJB-классы и WAR-файлы упакованы в одном и том же EAR-файле, выполните следующие действия:

  1. настройте ejb-jar.xml , чтобы сообщить weblogicпредоставить компоненты EJB внешним компонентам;

    <enterprise-beans>
    <session>
        <ejb-name>MyEJBBean</ejb-name>
        <business-local>com.app.MyEJBBeanLocalInterface</business-local>
        <ejb-class>com.app.MyEJBBeanLocalImpl</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>
        <ejb-local-ref>
            <ejb-ref-name>ejb/MyEJBBeanLocal</ejb-ref-name>
            <local>com.app.MyEJBBeanLocalInterface</local>
        </ejb-local-ref>
    </session>
     <enterprise-beans>
    
  2. Вставить в web.xml вашего веб-приложения ссылку на EJB через ссылку ejbназвание.Ejb-ref-name - это имя, видимое для управляемых компонентов JSF.

    <ejb-local-ref>
      <ejb-ref-name>ejb/MyEJBBeanLocal</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      <local>com.app.MyEJBBeanLocalInterface</local>
      <ejb-link>MyEJBBean</ejb-link>
    </ejb-local-ref>
    
  3. В вашем Управляемом компоненте JSF вызовите компонент EJB через поиск JNDI какследующее: try { Context context = new InitialContext(); MyEJBBeanLocalInterface myEJBBean = context.lookup("java:comp/env/ejb/MyEJBBeanLocal"); } catch (NamingException e) { e.printStackTrace(); }

В моем случае я использовал Weblogic 10.3.6 (11g), JSF 2.0 и EJB 3.0 с JPA (Eclipselink)

1 голос
/ 15 июня 2011

Так вот, это ритм! Есть простой способ исправить это.

  1. Откройте jsf-2.0.war в разделе ... wlserver_10.3 \ common \ deployable-library

  2. Перейдите к WEB-INF / lib и сохраните куда-нибудь JAR-файл wls.jsf.di.jar

  3. Поместите JAR-файл wls.jsf.di.jar в папку lib вашего WAR-приложения.

  4. Развертывание

теперь все должно работать, просто добавив @EJB к свойству в @ ManagedBean.

...