Вопрос по managed-bean, jsf, jboss7.x, jboss-weld – JBoss 7.1 Weld находит Управляемый боб в банке на ухе, но война не дает

1

jboss-as-7.1.1, динамический веб-модуль 3.0, JSF 2.0 (Mojarra), Eclipse Indigo sr2

У меня есть EAR, Ynale.ear, который содержит YnaleImpl.jar и Ynale.war:

Ynale.ear
  |-YnaleWeb.war
  |   |-META-INF
  |   |   |-MANIFEST.MF:
  |   |         Manifest-Version: 1.0
  |   |         Class-Path: deployment.Ynale.ear.YnaleImpl
  |   |
  |   |-WEB-INF
  |   |   |-beans.xml
  |   |   |       (empty)
  |   |   |
  |   |   |-faces-config.xml:
  |   |   |       <?xml version="1.0" encoding="UTF-8"?>
  |   |   |       <faces-config version="2.0" 
  |   |   |           xmlns="http://java.sun.com/xml/ns/javaee"
  |   |   |           xmlns:xi="http://www.w3.org/2001/XInclude"
  |   |   |           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/web-facesconfig_2_0.xsd">
  |   |   |        </faces-config>
  |   |   |
  |   |   |-web.xml:
  |   |          <?xml version="1.0" encoding="UTF-8"?>
  |   |          <web-app version="3.0" 
  |   |              xmlns="http://java.sun.com/xml/ns/javaee"
  |   |              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/web-app_3_0.xsd">
  |   |              <display-name>YnaleWeb</display-name>
  |   |              <context-param>
  |   |                  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  |   |                  <param-value>server</param-value>
  |   |              </context-param>
  |   |              <context-param>
  |   |                  <param-name>primefaces.THEME</param-name>
  |   |                  <param-value>redmond</param-value>
  |   |              </context-param>
  |   |              <servlet>
  |   |                  <servlet-name>Faces Servlet</servlet-name>
  |   |                  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  |   |                  <load-on-startup>1</load-on-startup>
  |   |              </servlet>
  |   |              <servlet-mapping>
  |   |                  <servlet-name>Faces Servlet</servlet-name>
  |   |                  <url-pattern>*.jsf</url-pattern>
  |   |              </servlet-mapping>
  |   |              <servlet-mapping>
  |   |                  <servlet-name>Faces Servlet</servlet-name>
  |   |                  <url-pattern>*.xhtml</url-pattern>
  |   |              </servlet-mapping>
  |   |              <session-config>
  |   |                  <session-timeout>300</session-timeout>
  |   |                  <cookie-config>
  |   |                      <name>JSESSIONID</name>
  |   |                  </cookie-config>
  |   |                  <tracking-mode>COOKIE</tracking-mode>
  |   |              </session-config>
  |   |         </web-app>
  |   |
  |   |-Login.xhtml
  |            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  |            <html xmlns="http://www.w3.org/1999/xhtml"
  |                xmlns:h="http://java.sun.com/jsf/html"
  |                xmlns:f="http://java.sun.com/jsf/core"
  |                xmlns:ui="http://java.sun.com/jsf/facelets">
  |            <h:head>
  |                <title>YNALE Log in page</title>
  |            </h:head>
  |            <f:view>
  |                <body>   
  |                    <div>#{textValue.value()}</div>
  |                </body>
  |            </f:view>
  |            </html>
  |
  |-lib
      |-META_INF
      |      jboss-deployment-structure.xml:
      |          <jboss-deployment-structure>
      |              <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
      |              <deployment>
      |                  <dependecies>
      |                      <module name="deployment.Ynale.ear.YnaleImpl" export="true"/>
      |                  </dependencies>
      |              </deployment>
      |              <module name="deployment.Ynale.ear.YnaleImpl" >
      |                  <resources>
      |                      <resource-root path="lib/YnaleImpl.jar" />
      |                  </resources>
      |              </module>
      |          </jboss-deployment-structure>
      |
      |-YnaleImpl.jar:
          |-META-INF
          |     beans.xml:
          |         (empty)
          |     MANIFEST.MF:
          |         Manifest-Version: 1.0
          |
          |-org
              |-ynale
                  |-utils
                      |-TextValue.class
                                package org.ynale.utils;

                                import javax.faces.bean.ManagedBean;
                                import javax.faces.bean.RequestScoped;

                                @ManagedBean
                                @RequestScoped
                                public class TextValue {
                                    public TextValue() {}

                                    public String value() {
                                        return "TextValue";
                                    }
                                }

В Utility.jar есть файл beans.xml, и при запуске система WELD находит его и записывает в журнал:

WELD-000106 Bean: Managed Bean [class org.ynale.utils.TextValue] with qualifiers [@Any @Default]

В Web.war у меня есть login.xhtml, который имеет:

#{textValue.value()}

Я не получаю ошибок в журнале (вывод вниз до FIN / DEBUG), но textValue.value () никогда не вызывается. Я не получаю вывод на своей странице.

Есть идеи?

РЕДАКТИРОВАТЬ: управляемые бины, определенные внутри самой WAR, работают нормально.

РЕДАКТИРОВАТЬ 2: Извините, у меня есть один и забыл включить в пост:

<?xml version="1.0"?>
    <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xi="http://www.w3.org/2001/XInclude"
        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/web-facesconfig_2_0.xsd"/>

Ваш Ответ

1   ответ
2

который является реализацией CDI, не сканирует специфичные для JSF 2 аннотации, он только сканирует специфичные для CDI аннотации, такие как@Named, У вас там есть JSF 2@ManagedBean аннотация вместо. Для этого вам нужно иметь JSF 2-совместимый/META-INF/faces-config.xml в JAR, чтобы получить веб-приложение JSF 2 для сканирования классов с конкретными аннотациями JSF 2 в файле JAR, который находится в/WEB-INF/lib.

See also: How to reference JSF managed beans which are provided in a JAR file? Structure for multiple JSF projects with shared code
Я попробую @Name и посмотрю, работает ли это. Причина, по которой код находится в отдельном JAR, заключается в том, что у меня будет YnaleWeb.WAR для доступа в Интернет и YnaleWS.WAR (веб-службы) для доступа в интрасети. Я хотел поделиться всей бизнес-логикой. Конкретный экземпляр сервера может запускать один или оба из WAR. Знаете ли вы о лучшем способе сделать это? Jay
Бизнес-логика принадлежит EJB, а не управляемым компонентам JSF. Сделай это@Stateless (или, может быть@Stateful) вместо этого и введите его@EJB в ваших обычных управляемых компонентах JSF, находящихся в WAR (или одном из его JAR-файлов в/WEB-INF/lib, конечно).
Спасибо за быстрый ответ! Смотрите мое редактирование выше. Jay
Я знаю, что вы эксперт! Я уже потратил 2 дня, просматривая все остальные ваши посты. Это просто не похоже на работу. Я что-то упустил где-то .... Jay
JAR должен войти в/WEB-INF/lib ВОЙНЫ. JSF не сканирует JAR в других местах. CDI, однако, делает. Если вы замените@ManagedBean от@Named (и импорт@RequestScoped отjavax.enterprise.context вместо), тогда это должно работать. Но банки в/lib EAR, как правило, не содержат определенных артефактов веб / внешнего интерфейса, так что это было бы совершенно неправильно в первую очередь. Банки в/lib EAR обычно содержат код общего бизнеса (EJB / JPA / Entity).

Похожие вопросы