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