【问题标题】:Converting JSF with managed-property to CDI将具有托管属性的 JSF 转换为 CDI
【发布时间】:2012-05-19 01:18:47
【问题描述】:

我们有一个非常复杂的 JSF 托管 bean 配置文件,如下所示。
有什么方法可以将其转换为某种 CDI 配置?
现在,当我们在 AbcConfigFactory 上使用 @Inject 时,它不会初始化配置文件中的值。我想这是因为我们使用 CDI 来初始化它,而不是 JSF ......或类似的东西。 :)

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2"
   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-facesconfig_1_2.xsd">

   <managed-bean>
      <managed-bean-name>AbcConfig</managed-bean-name>
      <managed-bean-class>com.a.b.c.AbcConfigFactory</managed-bean-class>
      <managed-bean-scope>application</managed-bean-scope>
      <managed-property>
         <property-name>abcSites</property-name>
         <list-entries>
            <value-class>com.a.b.c.SiteConfigBean</value-class>
            <value>#{SiteConfig$A}</value>
            <value>#{SiteConfig$B}</value>
         </list-entries>
      </managed-property>
   </managed-bean>


   <managed-bean>
      <managed-bean-name>SiteConfig$A</managed-bean-name>
      <managed-bean-class>com.a.b.c.SiteConfigBean</managed-bean-class>
      <managed-bean-scope>none</managed-bean-scope>
      <managed-property>
         <property-name>siteName</property-name>
         <value>A</value>
      </managed-property>

      <managed-property>
         <property-name>starConfig</property-name>
         <property-class>com.a.b.c.StarConfigBean</property-class>
         <value>#{StarConfig$A}</value>
      </managed-property>
   </managed-bean>

   <managed-bean>
      <managed-bean-name>SiteConfig$B</managed-bean-name>
      <managed-bean-class>com.a.b.c.SiteConfigBean</managed-bean-class>
      <managed-bean-scope>none</managed-bean-scope>
      <managed-property>
         <property-name>siteName</property-name>
         <value>B</value>
      </managed-property>

      <managed-property>
         <property-name>starConfig</property-name>
         <property-class>com.a.b.c.StarConfigBean</property-class>
         <value>#{StarConfig$A}</value>
      </managed-property>
   </managed-bean>

   <managed-bean>
      <managed-bean-name>StarConfig$A</managed-bean-name>
      <managed-bean-class>com.a.b.c.StarConfigBean</managed-bean-class>
      <managed-bean-scope>none</managed-bean-scope>
      <managed-property>
         <property-name>siteName</property-name>
         <value>A</value>
      </managed-property>
   </managed-bean>
</faces-config>

【问题讨论】:

    标签: java jsf cdi managed-bean jboss-weld


    【解决方案1】:

    CDI 规范的初始版本中包含 XML 配置 bean,但后来被删除,只是为了在最近的规范的未来版本中重新包含 (AFAIK)。

    所以,简短的回答是:不,您不能使用 XML 来配置 CDI bean(并且由于 CDI 和 JSF 是两个不同的东西,您将无法重用 JSF配置文件没有更改 - 显然)。

    您的问题的解决方案附带Seam Solder,它使用 CDI 的扩展机制来准确添加该功能(以及更多)。但是您仍然需要重新配置您的配置以适合您的 CDI bean。

    在不了解您的问题域的情况下:

    如果 XML 配置是某种历史遗留物,不是由现实世界的需求(例如针对不同的部署场景有不同的布线)强制的,我强烈建议转储 XML 并切换CDI 的基于类型安全注解的方法。有适用于所有主流用例的概念(例如用于测试的不同布线),您可以从用 XML 进行“编码”的负担中解脱出来。

    如果您真的需要(或仍然想要)基于 XML 的配置,Seam Solder 是您的不二之选。

    【讨论】:

    • 认为我们使用 XML 配置可以更轻松地配置应用程序。但我不确定。
    猜你喜欢
    • 2013-08-20
    • 2016-07-09
    • 2011-12-25
    • 2011-06-19
    • 2012-06-30
    • 2014-04-25
    • 2013-12-23
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多