Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行时JSR-299(CDI)配置_Java_Java Ee 6_Cdi_Jboss Weld - Fatal编程技术网

Java 运行时JSR-299(CDI)配置

Java 运行时JSR-299(CDI)配置,java,java-ee-6,cdi,jboss-weld,Java,Java Ee 6,Cdi,Jboss Weld,我需要为不同的运行时环境配置不同的@Alternative、@Decorators和@Injector(想想测试、登台和生产服务器) 现在我使用maven创建了三场战争,这些战争之间的唯一区别在于beans.xml文件。有更好的方法吗?我确实有针对不同环境的@Alternative@原型,但即使这样,我也需要修改beans.xml,而且它们对@Decorators不起作用(或者它们是否起作用?) 是否可以指示CDI忽略beans.xml中的值并使用自定义配置源?因为我可以读取系统属性或其他环境变

我需要为不同的运行时环境配置不同的@Alternative、@Decorators和@Injector(想想测试、登台和生产服务器)

现在我使用maven创建了三场战争,这些战争之间的唯一区别在于beans.xml文件。有更好的方法吗?我确实有针对不同环境的@Alternative@原型,但即使这样,我也需要修改beans.xml,而且它们对@Decorators不起作用(或者它们是否起作用?)

是否可以指示CDI忽略beans.xml中的值并使用自定义配置源?因为我可以读取系统属性或其他环境变量

该应用程序只在使用Weld的容器中运行,因此特定于Weld的解决方案就可以了

我已经试过用谷歌搜索这个,但似乎找不到好的搜索词,我问了,但没有用。那边有人建议编写我自己的自定义扩展,但我找不到任何API在运行时实际更改容器配置

我认为有可能拥有某种@ApplicationScoped配置bean,并将其注入所有@Decorators,然后这些@Decorators可以自行决定它们是否应该处于活动状态,然后为了配置@Alternations write@为每个接口生成方法,并使用多个实现注入配置bean那里也有。 但在我看来,这似乎是为了复制CDI中已经存在的功能而进行的大量不必要的工作

编辑

好吧,我意识到我有点笨。。。当然,可以在运行时使用CDI扩展API添加原型和接口:

void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
    bbd.addInterceptorBinding(...)
    bbd.addStereotype(...)
}
但我没有找到添加装饰器的API。我唯一发现的是激活beans.xml中的所有@Decorators,然后观察

public <T> void processAnotated(@Observes ProcessAnnotatedType<T> event)

如果我不希望@Decorator处于活动状态。

您可能需要查看JBoss Seam,特别是焊料子项目

它允许依赖驱动的CDI解析,因此某些bean只有在其他bean或资源可用时才可用。(如果“数据源”可用,则为A类;如果“entityManager”可用,则为B类)

由于它是开源的,您还可以看看他们是如何将其连接在一起的,并在需要时将这些知识用作编写自己的扩展的基础


如果您使用的是JSF,我强烈建议您也使用SEAM-JSF,因为它摆脱了拥有两个注入框架(JSF DI/CDI)的笨拙,并允许在JSF范围内使用CDI bean。

我们需要编写一个扩展来切换替代方案,这非常令人沮丧。。。
event.veto()