java - 将具有托管属性的 JSF 转换为 CDI

标签 java jsf cdi managed-bean jboss-weld

我们有一个非常复杂的 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>

最佳答案

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

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

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

在对您的问题域一无所知的情况下:

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

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

关于java - 将具有托管属性的 JSF 转换为 CDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10534494/

相关文章:

Java Swing 制作具有自定义尺寸的盒子

java - String.endsWith 的 StringBuffer 替代品是什么?

jsf - 如何延迟加载与 p :Tab, 中包含的页面关联的 ManagedBean 仅在打开 Tab 时

java - Ajax 无法与 h :inputSecret 一起使用

java - 将 Stateless (Webservice)Bean 注入(inject)另一个 Bean

java - 使用 JEE5 和 Tomcat6 的 CDI/焊接

java - 泛型无法做出正确的推论

java - Android:来自LAN的Mediaplayer流

jsf - 以编程方式访问 JSF 应用程序中的属性文件

jakarta-ee - 在由生产者方法创建的 bean 中,cdi 注入(inject)的依赖项解析为 null