【问题标题】:Use beans from a project in the xhtml of another project在另一个项目的 xhtml 中使用项目中的 bean
【发布时间】:2013-08-16 23:26:40
【问题描述】:

我有几个项目,在同一个应用程序中,具有粗略的结构:

  • 父级
    • 耳朵
    • ejb
    • 坚持
    • 网络

我使用 Maven 解决所有依赖关系,并将所有内容都很好地捆绑到一个 WAR 中,然后我将其部署在 JBoss 上。

我的问题是我的大部分模型都在 ejb 项目中,我需要这些 bean 在 Backing Bean 逻辑中(在 Web 中)或在 JSF .xhtmls 中直接调用(也在 Web 中)。

我搜索了互联网,包括堆栈溢出,并在 SPRING 以及如何导入/导出模块上找到了大量示例。好吧,因为我没有使用它,所以我不知道如何继续。

那么我如何从另一个项目中导入/使用这些 bean?

感谢任何帮助!

【问题讨论】:

    标签: jsf maven primefaces ejb


    【解决方案1】:

    由于您使用的是您提到的技术堆栈,因此不妨也使用 CDI。无论如何,如果您将所有内容都打包为 WAR,那么这只是运行时的一个模块。假设你有以下结构:

    --- WAR
     |--- any *.xhtml files can live here (public)
     |--- WEB-INF
       |--- web.xml (optional)
       |--- persistence.xml (optional) - declare persistence unit used from WEB-INF/classes
       |--- beans.xml (optional) enable CDI annotation scanning for WEB-INF/classes
       |--- faces-config.xml (optional) enable JSF annotation scanning in WEB-INF/classes
       |--- *.xhtml files can live here (private - usually templates, ui:composition, etc.)
       |--- classes
         |--- com.example - put managed beans here, EJBs, JPA etities or just about any other *.class
       |---lib
         |--- jpa.jar
           |--- META-INF
             |--- persistence.xml - persistence unit used in this jar
           |--- com.example - JPA entities can live here, gets mapped to WEB-INF/classes at runtime
         |--- ejb.jar
           |--- META-INF
             |--- ejb-jar.xml (optional) but can declare resources here
           |--- com.example - ejbs can live here, gets mapped to /WEB-INF/classes at runtime
         |--- faces.jar
           |--- META-INF
             |--- faces-config.xml - enables scanning JSF specific annotations in this jar
           |--- resources - this gets mapped to the WAR root at runtime, .xhtml can live here
           |--- com.example - put your @ManagedBean s here and @EJB inject anything from ejb.jar, gets mapped to /WEB-INF/classes at runtime
         |--- cdi.jar
           |--- META-INF
             |--- beans.xml - marks this as CDI bean archive
           |--- com.example - CDI beans can live here, gets mapped to WEB-INF/classes at runtime
    

    请注意,尽管我在上面的结构中专门分离了 jpa.jar、ejb.jar、faces.jar 和 CDI.jar,但没有什么说你必须这样做 - 你可以随意混合和匹配。要点:

    1. 对于 WAR 的 WEB-INF/lib 类中的任何 jar,在运行时都会映射到 /WEB-INF/classes
    2. beans.xml 启用 CDI
    3. faces-config.xml 启用 JSF 注释扫描
    4. ejb-jar.xml 在任何地方都不需要,但您可以利用它
    5. web.xml 可以住在WEB-INF/,但不是必需的
    6. web-fragment.xml 可以存在于WEB-INF/lib 内任何jar 的META-INF 文件夹中,并合并到web.xml
    7. .xhtml JSF 文件可以存在于WEB-INF/(私有)内的网络应用程序根目录(公共)中,以及WEB-INF/lib 内任何 jar 的META-INF/resources 内——所有这些文件都被映射到网络应用程序根目录(即它们可以如果在 jar 中它们在 META-INF/resource/WEB-INF 内,则逻辑上最终会在 WEB-INF/ 内)
    8. persistence.xml 可以居住在 WEB-INFMETA-INF 内的任何罐子内 WEB-INF/lib

    这应该只是覆盖它 - 如果有任何不清楚或可以添加的内容,请告诉我。

    【讨论】:

    • 好吧,我的 Maven 以某种方式奇怪地打包了它们!并不是我所有的 bean 最终都在 WEB-INF/classes 中。正如我配置它们一样,它们位于单独的快照中。令我烦恼的是,该实现仅在 WEB-INF/classes 中搜索...
    • bean 是指 JSF 托管 bean 还是 CDI bean 或 EJB?
    • 但这并不重要,它大致相同,只是不是我所有的类都映射到 WEB-INF/类。这实际上是我的问题。感谢您的解释,它有助于找到我的包装问题。我现在已经用 Maven 修复了它们!无论如何,我会认为这是正确的答案,因为您确实提供了有关如何打包 bean 以使其可访问的见解!
    • 我指的是 EJB (@Stateless),其中大部分是 bean。基本上它并没有将我其他 jar 中的所有 bean 映射到 WEB-INF/类。附言我也会考虑添加 CDI!
    • 嗯,从来没有问题,但是,是的,CDI ftw :)
    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 2015-04-12
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多