3

我们有一个非常复杂的 JSF 托管 bean 配置文件,如下所示。
有什么方法可以将其转换为某种 CDI 配置?
现在,当我们使用它时@InjectAbcConfigFactory它不会初始化配置文件中的值。我想这是因为我们使用 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>
4

1 回答 1

1

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

所以,简短的回答是:不,你不能使用 XML 来配置 CDI bean(因为 CDI 和 JSF 是两个不同的东西,你不能在不改变的情况下重用 JSF 配置文件 - 显然)。

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

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

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

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

于 2012-05-10T13:26:44.070 回答